Files
trade/data/schema/config.sql
T
Rekey e91cad79e6 feat(data): 实现配置表 CRUD 与 Schema 初始化拆分
- 新增 data/db/ 数据库访问层:pool 管理、类型定义、Zod 校验、参数化 SQL 查询
- 新增 data/db/config-crud.ts:MonitoredSymbolsRepo / ExchangeConfigRepo / AppConfigRepo 三个 CRUD 服务类
- 新增 data/config.ts:中心化配置模块,零依赖 .env 解析 + Zod 校验
- 新增 data/schema/:klines.sql + config.sql 参考 DDL
- 新增 data/exchanges/:交易所类型定义与 Binance WebSocket 封装
- 新增 data/run/:交易所连接启动入口
- 重构 data/init-db/:001_init.sql 仅保留 TimescaleDB + klines,配置表拆分至 002_config.sql
- 更新 docker-compose.yml:挂载 init-db 初始化脚本
2026-06-07 20:46:35 +08:00

178 lines
8.6 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- ============================================================
-- schema/config.sql — 配置表 DDL(参考副本)
-- ============================================================
-- 数据库:TimescaleDB (PostgreSQL 17)
-- 说明:管理系统配置、监控标的、交易所连接参数
--
-- ⚠️ 权威初始化脚本已迁移至:data/init-db/001_init.sql
-- 本文件保留作为 pg.initSchema() 非 Docker 部署的回退方案和文档参考。
-- 修改表结构时请同步更新 001_init.sql。
-- ============================================================
-- ============================================================
-- 1. monitored_symbols — 监控交易对配置
-- ============================================================
-- 用途:声明数据采集模块需要订阅哪些交易对的 K 线流
-- 消费方:WebSocket 行情采集服务启动时读取此表决定订阅列表
-- ============================================================
CREATE TABLE IF NOT EXISTS monitored_symbols (
id SERIAL PRIMARY KEY,
-- ---- 标识维度(与 klines 表对齐) ----
exchange TEXT NOT NULL, -- 交易所:binance / okx / bybit
symbol TEXT NOT NULL, -- 交易对:BTCUSDT / ETHUSDT
interval TEXT NOT NULL, -- K 线周期:1m / 5m / 15m / 1h / 4h / 1d
-- ---- 控制字段 ----
enabled BOOLEAN NOT NULL DEFAULT TRUE, -- 是否启用采集
priority SMALLINT NOT NULL DEFAULT 0, -- 优先级(数值越大越优先,用于限频时取舍)
-- ---- 备注 ----
label TEXT, -- 人类可读标签,如 "BTC/USDT 1分钟线"
notes TEXT, -- 备注说明
-- ---- 元数据 ----
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
-- 同一 (exchange, symbol, interval) 组合不可重复
UNIQUE (exchange, symbol, interval)
);
-- 索引:按启用状态快速筛选
CREATE INDEX IF NOT EXISTS idx_monitored_symbols_enabled
ON monitored_symbols (enabled, exchange, priority DESC);
-- 索引:按交易对查找所有周期
CREATE INDEX IF NOT EXISTS idx_monitored_symbols_symbol
ON monitored_symbols (symbol, interval);
COMMENT ON TABLE monitored_symbols IS '监控交易对配置表:声明哪些 (交易所,交易对,周期) 需要采集 K 线数据';
COMMENT ON COLUMN monitored_symbols.exchange IS '交易所标识:binance / okx / bybit';
COMMENT ON COLUMN monitored_symbols.symbol IS '交易对:BTCUSDT / ETHUSDT';
COMMENT ON COLUMN monitored_symbols.interval IS 'K 线周期:1m / 5m / 15m / 1h / 4h / 1d';
COMMENT ON COLUMN monitored_symbols.enabled IS '是否启用 WebSocket 订阅';
COMMENT ON COLUMN monitored_symbols.priority IS '优先级(0-32767),限频时高优先级交易对优先保留';
-- ============================================================
-- 2. exchange_config — 交易所连接配置
-- ============================================================
-- 用途:存储各交易所的 API 端点、限频参数等连接级配置
-- 安全提醒:API Key/Secret 不应明文存储于此表,
-- 建议通过环境变量或 Vault 注入,此表仅存非敏感参数
-- ============================================================
CREATE TABLE IF NOT EXISTS exchange_config (
id SERIAL PRIMARY KEY,
-- ---- 交易所标识 ----
exchange TEXT NOT NULL UNIQUE, -- 交易所:binance / okx / bybit
-- ---- 连接参数 ----
rest_url TEXT, -- REST API 基础 URL(留空则用 SDK 默认值)
ws_url TEXT, -- WebSocket 基础 URL(留空则用 SDK 默认值)
ws_ping_interval_ms INTEGER NOT NULL DEFAULT 30000, -- 心跳间隔(毫秒)
-- ---- 限频控制 ----
rate_limit_per_sec REAL NOT NULL DEFAULT 20.0, -- 每秒最大请求数
max_reconnect_attempts INT NOT NULL DEFAULT 10, -- 最大重连次数
reconnect_delay_ms INT NOT NULL DEFAULT 3000, -- 重连延迟基数(指数退避)
-- ---- 开关 ----
enabled BOOLEAN NOT NULL DEFAULT TRUE, -- 是否启用该交易所
-- ---- 备注 ----
notes TEXT,
-- ---- 元数据 ----
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
COMMENT ON TABLE exchange_config IS '交易所连接配置表:REST/WS 端点、限频、重连策略';
COMMENT ON COLUMN exchange_config.rest_url IS 'REST API 地址,空则使用 SDK 默认';
COMMENT ON COLUMN exchange_config.ws_url IS 'WebSocket 地址,空则使用 SDK 默认';
COMMENT ON COLUMN exchange_config.rate_limit_per_sec IS '每秒最大请求数(Binance 默认 20/s';
COMMENT ON COLUMN exchange_config.max_reconnect_attempts IS 'WebSocket 断线最大重连次数';
COMMENT ON COLUMN exchange_config.reconnect_delay_ms IS '重连退避基数(实际延迟 = 基数 × 2^attempts';
-- ============================================================
-- 3. app_config — 全局应用配置(Key-Value
-- ============================================================
-- 用途:存储不适合硬编码的运行时参数,如批量写入阈值
-- ============================================================
CREATE TABLE IF NOT EXISTS app_config (
id SERIAL PRIMARY KEY,
key TEXT NOT NULL UNIQUE, -- 配置键
value TEXT NOT NULL, -- 配置值(统一存为文本,消费方自行解析类型)
description TEXT, -- 说明
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
COMMENT ON TABLE app_config IS '全局应用配置(KV 结构),运行时参数集中管理';
-- 默认配置项
INSERT INTO app_config (key, value, description) VALUES
('batch_size', '500', '批量写入缓冲区条数阈值'),
('flush_interval_ms', '1000', '缓冲区最大等待时间(毫秒)'),
('log_level', 'info', '日志级别:trace / debug / info / warn / error'),
('redis_publish_enabled', 'true', '是否启用 Redis 发布')
ON CONFLICT (key) DO NOTHING;
-- ============================================================
-- 4. 初始数据:预置常见交易对的监控配置
-- ============================================================
-- 以下为建议的默认监控列表,可根据实际需求增删
INSERT INTO monitored_symbols (exchange, symbol, interval, enabled, priority, label) VALUES
-- Binance 主力交易对 — 1m
('binance', 'BTCUSDT', '1m', TRUE, 10, 'BTC/USDT 1分钟线'),
('binance', 'ETHUSDT', '1m', TRUE, 9, 'ETH/USDT 1分钟线'),
('binance', 'SOLUSDT', '1m', TRUE, 8, 'SOL/USDT 1分钟线'),
('binance', 'BNBUSDT', '1m', TRUE, 7, 'BNB/USDT 1分钟线'),
-- Binance 主力交易对 — 1h(策略用)
('binance', 'BTCUSDT', '1h', TRUE, 10, 'BTC/USDT 1小时线'),
('binance', 'ETHUSDT', '1h', TRUE, 9, 'ETH/USDT 1小时线'),
('binance', 'SOLUSDT', '1h', TRUE, 8, 'SOL/USDT 1小时线'),
-- Binance 主力交易对 — 1d(日线)
('binance', 'BTCUSDT', '1d', TRUE, 10, 'BTC/USDT 日线'),
('binance', 'ETHUSDT', '1d', TRUE, 9, 'ETH/USDT 日线')
ON CONFLICT (exchange, symbol, interval) DO NOTHING;
-- 预置交易所默认连接配置
INSERT INTO exchange_config (exchange, rate_limit_per_sec, notes) VALUES
('binance', 20.0, 'Binance 现货 — 默认权重限频 1200/min'),
('okx', 10.0, 'OKX 现货 — 默认限频 10/s'),
('bybit', 10.0, 'Bybit 现货 — 默认限频 10/s')
ON CONFLICT (exchange) DO NOTHING;
-- ============================================================
-- 5. 常用查询示例
-- ============================================================
-- 查询所有启用的监控标的(采集服务启动时使用)
-- SELECT exchange, symbol, interval, priority
-- FROM monitored_symbols
-- WHERE enabled = TRUE
-- ORDER BY exchange, priority DESC, symbol, interval;
-- 查询某交易所下所有交易对
-- SELECT DISTINCT symbol
-- FROM monitored_symbols
-- WHERE exchange = 'binance' AND enabled = TRUE
-- ORDER BY symbol;
-- 禁用某个交易对的采集
-- UPDATE monitored_symbols SET enabled = FALSE, updated_at = NOW()
-- WHERE exchange = 'binance' AND symbol = 'BTCUSDT' AND interval = '1m';
-- 新增监控标的(动态添加,无需重启)
-- INSERT INTO monitored_symbols (exchange, symbol, interval, enabled, priority, label)
-- VALUES ('binance', 'DOGEUSDT', '1m', TRUE, 5, 'DOGE/USDT 1分钟线')
-- ON CONFLICT (exchange, symbol, interval) DO UPDATE
-- SET enabled = TRUE, updated_at = NOW();