rebuild(stage-5): establish market data gateway and charts
This commit is contained in:
@@ -0,0 +1,114 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import sqlite3
|
||||
|
||||
from backend.database.migrations.runner import Migration
|
||||
|
||||
|
||||
def upgrade(connection: sqlite3.Connection) -> None:
|
||||
connection.execute(
|
||||
"""
|
||||
CREATE TABLE trading_days (
|
||||
trade_date TEXT PRIMARY KEY,
|
||||
is_open INTEGER NOT NULL CHECK (is_open IN (0, 1)),
|
||||
previous_open_date TEXT,
|
||||
source TEXT NOT NULL,
|
||||
observed_at TEXT NOT NULL
|
||||
)
|
||||
"""
|
||||
)
|
||||
connection.execute(
|
||||
"""
|
||||
CREATE TABLE market_entities (
|
||||
entity_type TEXT NOT NULL,
|
||||
identifier TEXT NOT NULL,
|
||||
code TEXT NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
search_key TEXT NOT NULL,
|
||||
sector TEXT,
|
||||
active INTEGER NOT NULL DEFAULT 1 CHECK (active IN (0, 1)),
|
||||
source TEXT NOT NULL,
|
||||
observed_at TEXT NOT NULL,
|
||||
PRIMARY KEY (entity_type, identifier)
|
||||
)
|
||||
"""
|
||||
)
|
||||
connection.execute(
|
||||
"""
|
||||
CREATE INDEX market_entities_search_idx
|
||||
ON market_entities(active, search_key, entity_type)
|
||||
"""
|
||||
)
|
||||
connection.execute(
|
||||
"""
|
||||
INSERT INTO market_entities (
|
||||
entity_type, identifier, code, name, search_key,
|
||||
sector, active, source, observed_at
|
||||
) VALUES
|
||||
(
|
||||
'index', '000001.SH', '000001', '上证指数',
|
||||
'000001 上证指数 shanghai', NULL, 1, 'local', '2026-07-30T00:00:00+08:00'
|
||||
),
|
||||
(
|
||||
'index', '399001.SZ', '399001', '深证成指',
|
||||
'399001 深证成指 shenzhen', NULL, 1, 'local', '2026-07-30T00:00:00+08:00'
|
||||
),
|
||||
(
|
||||
'index', '399006.SZ', '399006', '创业板指',
|
||||
'399006 创业板指 chinext', NULL, 1, 'local', '2026-07-30T00:00:00+08:00'
|
||||
)
|
||||
"""
|
||||
)
|
||||
connection.execute(
|
||||
"""
|
||||
CREATE TABLE market_summaries (
|
||||
trade_date TEXT PRIMARY KEY,
|
||||
observed_at TEXT NOT NULL,
|
||||
state TEXT NOT NULL CHECK (state IN ('realtime', 'final', 'archive')),
|
||||
source TEXT NOT NULL,
|
||||
coverage REAL NOT NULL CHECK (coverage >= 0 AND coverage <= 1),
|
||||
payload_json TEXT NOT NULL,
|
||||
created_at TEXT NOT NULL
|
||||
)
|
||||
"""
|
||||
)
|
||||
connection.execute(
|
||||
"""
|
||||
CREATE TABLE chart_series (
|
||||
entity_type TEXT NOT NULL,
|
||||
identifier TEXT NOT NULL,
|
||||
interval TEXT NOT NULL CHECK (interval IN ('day', 'minute')),
|
||||
trade_date TEXT NOT NULL,
|
||||
observed_at TEXT NOT NULL,
|
||||
source TEXT NOT NULL,
|
||||
usage TEXT NOT NULL CHECK (usage IN ('display', 'calculation')),
|
||||
adjustment TEXT NOT NULL,
|
||||
coverage REAL NOT NULL CHECK (coverage >= 0 AND coverage <= 1),
|
||||
payload_json TEXT NOT NULL,
|
||||
created_at TEXT NOT NULL,
|
||||
PRIMARY KEY (entity_type, identifier, interval, trade_date)
|
||||
)
|
||||
"""
|
||||
)
|
||||
connection.execute(
|
||||
"""
|
||||
CREATE INDEX chart_series_latest_idx
|
||||
ON chart_series(entity_type, identifier, interval, trade_date DESC)
|
||||
"""
|
||||
)
|
||||
|
||||
|
||||
def downgrade(connection: sqlite3.Connection) -> None:
|
||||
connection.execute("DROP TABLE chart_series")
|
||||
connection.execute("DROP TABLE market_summaries")
|
||||
connection.execute("DROP TABLE market_entities")
|
||||
connection.execute("DROP TABLE trading_days")
|
||||
|
||||
|
||||
MIGRATION = Migration(
|
||||
version=3,
|
||||
name="create_market_foundation",
|
||||
signature="market:v1:calendar-entities-summary-chart-provenance",
|
||||
upgrade=upgrade,
|
||||
downgrade=downgrade,
|
||||
)
|
||||
@@ -1,5 +1,6 @@
|
||||
from backend.database.migrations.m0001_accounts import MIGRATION as ACCOUNTS
|
||||
from backend.database.migrations.m0002_model_pool import MIGRATION as MODEL_POOL
|
||||
from backend.database.migrations.m0003_market_foundation import MIGRATION as MARKET_FOUNDATION
|
||||
from backend.database.migrations.runner import Migration
|
||||
|
||||
MIGRATIONS: tuple[Migration, ...] = (ACCOUNTS, MODEL_POOL)
|
||||
MIGRATIONS: tuple[Migration, ...] = (ACCOUNTS, MODEL_POOL, MARKET_FOUNDATION)
|
||||
|
||||
Reference in New Issue
Block a user