Files
trade/data/init-db/002_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

137 lines
6.3 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.
-- ============================================================
-- 002_config.sql — 配置表初始化
-- ============================================================
-- Docker Compose 首次启动时在 001_init.sql 之后自动执行
-- 挂载路径:./data/init-db:/docker-entrypoint-initdb.d
-- 执行顺序:按文件名排序(001 → 002)
-- ============================================================
-- ============================================================
-- 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);
-- ============================================================
-- 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()
);
-- ============================================================
-- 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()
);
-- 默认配置项(仅首次插入,已存在则跳过)
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. 预置种子数据
-- ============================================================
-- 预置 Binance 主力交易对监控配置(仅首次插入)
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;
-- ============================================================
-- 初始化完成
-- ============================================================
DO $$
BEGIN
RAISE NOTICE '002_config.sql — Config tables initialized.';
RAISE NOTICE 'Tables: monitored_symbols, exchange_config, app_config';
RAISE NOTICE 'Seed data: 9 symbols (Binance), 3 exchanges';
END $$;