#!/usr/bin/env python3 """追加期货分表模型到 models.py""" import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).parent.parent)) futures_split_tables = ''' # ============================================ # 期货日线历史数据表 (1d) - 分表 # ============================================ class FuturesKLine1DBase(Base): """期货日线K线 - 基础表 存储最基础的K线数据,对应 query_kline 接口 """ __tablename__ = "futures_klines_1d_base" __table_args__ = ( Index("idx_futures_1d_base_symbol_ts", "symbol_id", "ts"), Index("idx_futures_1d_base_symbol_date", "symbol_id", "trade_date"), ) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码") ts = Column(DateTime, nullable=False, comment="时间戳") trade_date = Column(String(10), nullable=False, index=True, comment="交易日 YYYY-MM-DD") # 基础价格数据 open = Column(Numeric(18, 4), nullable=False, comment="开盘价") high = Column(Numeric(18, 4), nullable=False, comment="最高价") low = Column(Numeric(18, 4), nullable=False, comment="最低价") close = Column(Numeric(18, 4), nullable=False, comment="收盘价") # 成交量额 volume = Column(BigInteger, nullable=False, comment="成交量") amount = Column(Numeric(20, 4), nullable=False, comment="成交额") # 期货特有 open_interest = Column(BigInteger, nullable=True, comment="持仓量") settlement = Column(Numeric(18, 4), nullable=True, comment="结算价") pre_settlement = Column(Numeric(18, 4), nullable=True, comment="昨结算价") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") class FuturesKLine1DQuote(Base): """期货日线K线 - 行情指标表 存储需要计算的行情指标 """ __tablename__ = "futures_klines_1d_quote" __table_args__ = ( Index("idx_futures_1d_quote_symbol_date", "symbol_id", "trade_date"), ) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码") trade_date = Column(String(10), nullable=False, index=True, comment="交易日 YYYY-MM-DD") # 涨跌幅 (需计算) change_pct = Column(Numeric(8, 4), nullable=True, comment="涨跌幅%") change_5d_pct = Column(Numeric(8, 4), nullable=True, comment="5日涨跌幅%") change_10d_pct = Column(Numeric(8, 4), nullable=True, comment="10日涨跌幅%") change_20d_pct = Column(Numeric(8, 4), nullable=True, comment="20日涨跌幅%") # 均线 (需计算) ma5 = Column(Numeric(18, 4), nullable=True, comment="5日均线") ma10 = Column(Numeric(18, 4), nullable=True, comment="10日均线") ma20 = Column(Numeric(18, 4), nullable=True, comment="20日均线") ma30 = Column(Numeric(18, 4), nullable=True, comment="30日均线") ma60 = Column(Numeric(18, 4), nullable=True, comment="60日均线") # MACD指标 (需计算) macd_dif = Column(Numeric(18, 6), nullable=True, comment="MACD DIF") macd_dea = Column(Numeric(18, 6), nullable=True, comment="MACD DEA") macd_bar = Column(Numeric(18, 6), nullable=True, comment="MACD BAR") # 持仓变化 oi_change = Column(BigInteger, nullable=True, comment="持仓量变化") oi_change_pct = Column(Numeric(8, 4), nullable=True, comment="持仓量变化%") # 振幅 amplitude = Column(Numeric(8, 4), nullable=True, comment="振幅%") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") # ============================================ # 期货分钟线历史数据表 - 分表 # ============================================ class FuturesKLine1MBase(Base): """期货1分钟K线 - 基础表""" __tablename__ = "futures_klines_1m_base" __table_args__ = ( Index("idx_futures_1m_base_symbol_ts", "symbol_id", "ts"), ) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码") ts = Column(DateTime, nullable=False, comment="时间戳") trade_date = Column(String(10), nullable=False, comment="交易日") open = Column(Numeric(18, 4), nullable=False, comment="开盘价") high = Column(Numeric(18, 4), nullable=False, comment="最高价") low = Column(Numeric(18, 4), nullable=False, comment="最低价") close = Column(Numeric(18, 4), nullable=False, comment="收盘价") volume = Column(BigInteger, nullable=False, comment="成交量") amount = Column(Numeric(20, 4), nullable=False, comment="成交额") open_interest = Column(BigInteger, nullable=True, comment="持仓量") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") class FuturesKLine5MBase(Base): """期货5分钟K线 - 基础表""" __tablename__ = "futures_klines_5m_base" __table_args__ = ( Index("idx_futures_5m_base_symbol_ts", "symbol_id", "ts"), ) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码") ts = Column(DateTime, nullable=False, comment="时间戳") trade_date = Column(String(10), nullable=False, comment="交易日") open = Column(Numeric(18, 4), nullable=False, comment="开盘价") high = Column(Numeric(18, 4), nullable=False, comment="最高价") low = Column(Numeric(18, 4), nullable=False, comment="最低价") close = Column(Numeric(18, 4), nullable=False, comment="收盘价") volume = Column(BigInteger, nullable=False, comment="成交量") amount = Column(Numeric(20, 4), nullable=False, comment="成交额") open_interest = Column(BigInteger, nullable=True, comment="持仓量") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") class FuturesKLine15MBase(Base): """期货15分钟K线 - 基础表""" __tablename__ = "futures_klines_15m_base" __table_args__ = ( Index("idx_futures_15m_base_symbol_ts", "symbol_id", "ts"), ) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码") ts = Column(DateTime, nullable=False, comment="时间戳") trade_date = Column(String(10), nullable=False, comment="交易日") open = Column(Numeric(18, 4), nullable=False, comment="开盘价") high = Column(Numeric(18, 4), nullable=False, comment="最高价") low = Column(Numeric(18, 4), nullable=False, comment="最低价") close = Column(Numeric(18, 4), nullable=False, comment="收盘价") volume = Column(BigInteger, nullable=False, comment="成交量") amount = Column(Numeric(20, 4), nullable=False, comment="成交额") open_interest = Column(BigInteger, nullable=True, comment="持仓量") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") class FuturesKLine30MBase(Base): """期货30分钟K线 - 基础表""" __tablename__ = "futures_klines_30m_base" __table_args__ = ( Index("idx_futures_30m_base_symbol_ts", "symbol_id", "ts"), ) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码") ts = Column(DateTime, nullable=False, comment="时间戳") trade_date = Column(String(10), nullable=False, comment="交易日") open = Column(Numeric(18, 4), nullable=False, comment="开盘价") high = Column(Numeric(18, 4), nullable=False, comment="最高价") low = Column(Numeric(18, 4), nullable=False, comment="最低价") close = Column(Numeric(18, 4), nullable=False, comment="收盘价") volume = Column(BigInteger, nullable=False, comment="成交量") amount = Column(Numeric(20, 4), nullable=False, comment="成交额") open_interest = Column(BigInteger, nullable=True, comment="持仓量") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") class FuturesKLine60MBase(Base): """期货60分钟K线 - 基础表""" __tablename__ = "futures_klines_60m_base" __table_args__ = ( Index("idx_futures_60m_base_symbol_ts", "symbol_id", "ts"), ) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码") ts = Column(DateTime, nullable=False, comment="时间戳") trade_date = Column(String(10), nullable=False, comment="交易日") open = Column(Numeric(18, 4), nullable=False, comment="开盘价") high = Column(Numeric(18, 4), nullable=False, comment="最高价") low = Column(Numeric(18, 4), nullable=False, comment="最低价") close = Column(Numeric(18, 4), nullable=False, comment="收盘价") volume = Column(BigInteger, nullable=False, comment="成交量") amount = Column(Numeric(20, 4), nullable=False, comment="成交额") open_interest = Column(BigInteger, nullable=True, comment="持仓量") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") # ============================================ # 期货周月线历史数据表 - 分表 # ============================================ class FuturesKLine1WBase(Base): """期货周线K线 - 基础表""" __tablename__ = "futures_klines_1w_base" __table_args__ = ( Index("idx_futures_1w_base_symbol_ts", "symbol_id", "ts"), ) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码") ts = Column(DateTime, nullable=False, comment="时间戳") trade_date = Column(String(10), nullable=False, comment="交易日") open = Column(Numeric(18, 4), nullable=False, comment="开盘价") high = Column(Numeric(18, 4), nullable=False, comment="最高价") low = Column(Numeric(18, 4), nullable=False, comment="最低价") close = Column(Numeric(18, 4), nullable=False, comment="收盘价") volume = Column(BigInteger, nullable=False, comment="成交量") amount = Column(Numeric(20, 4), nullable=False, comment="成交额") open_interest = Column(BigInteger, nullable=True, comment="持仓量") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") class FuturesKLine1MonBase(Base): """期货月线K线 - 基础表""" __tablename__ = "futures_klines_1month_base" __table_args__ = ( Index("idx_futures_1month_base_symbol_ts", "symbol_id", "ts"), ) id = Column(BigInteger, primary_key=True, autoincrement=True) symbol_id = Column(String(20), nullable=False, index=True, comment="合约代码") ts = Column(DateTime, nullable=False, comment="时间戳") trade_date = Column(String(10), nullable=False, comment="交易日") open = Column(Numeric(18, 4), nullable=False, comment="开盘价") high = Column(Numeric(18, 4), nullable=False, comment="最高价") low = Column(Numeric(18, 4), nullable=False, comment="最低价") close = Column(Numeric(18, 4), nullable=False, comment="收盘价") volume = Column(BigInteger, nullable=False, comment="成交量") amount = Column(Numeric(20, 4), nullable=False, comment="成交额") open_interest = Column(BigInteger, nullable=True, comment="持仓量") created_at = Column(DateTime, default=datetime.now, comment="创建时间") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") # ============================================ # 期货实时行情表 # ============================================ class FuturesRealTimeQuote(Base): """期货实时行情快照""" __tablename__ = "futures_realtime_quotes" symbol_id = Column(String(20), primary_key=True, comment="合约代码") update_time = Column(DateTime, nullable=False, comment="更新时间") # 价格数据 last_price = Column(Numeric(18, 4), nullable=True, comment="最新价") open = Column(Numeric(18, 4), nullable=True, comment="开盘价") high = Column(Numeric(18, 4), nullable=True, comment="最高价") low = Column(Numeric(18, 4), nullable=True, comment="最低价") pre_close = Column(Numeric(18, 4), nullable=True, comment="昨收") pre_settlement = Column(Numeric(18, 4), nullable=True, comment="昨结算") settlement = Column(Numeric(18, 4), nullable=True, comment="结算价") # 成交量额 volume = Column(BigInteger, nullable=True, comment="成交量") amount = Column(Numeric(20, 4), nullable=True, comment="成交额") open_interest = Column(BigInteger, nullable=True, comment="持仓量") # 买卖盘 bid1 = Column(Numeric(18, 4), nullable=True, comment="买一价") bid1_volume = Column(BigInteger, nullable=True, comment="买一量") ask1 = Column(Numeric(18, 4), nullable=True, comment="卖一价") ask1_volume = Column(BigInteger, nullable=True, comment="卖一量") # 涨跌停 limit_up = Column(Numeric(18, 4), nullable=True, comment="涨停价") limit_down = Column(Numeric(18, 4), nullable=True, comment="跌停价") updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") # ============================================ # 向后兼容的模型别名 # ============================================ # 股票表别名 StockKLine1D = StockKLine1DBase # 期货表别名(兼容旧代码) FuturesKLine1M = FuturesKLine1MBase FuturesKLine5M = FuturesKLine5MBase FuturesKLine1D = FuturesKLine1DBase ''' def main(): models_path = Path(__file__).parent.parent / "app" / "repositories" / "models.py" with open(models_path, 'r', encoding='utf-8') as f: original = f.read() # 移除旧的向后兼容别名(如果存在) marker = '\n\n\n# ============================================\n# 向后兼容的模型别名\n# ============================================\n\n# 旧代码可能引用的模型,现在映射到新表\nStockKLine1D = StockKLine1DBase\n# 注意: 1M/5M/15M/30M/60M/1W/1Month 表命名未加Base后缀,已在原始定义中' if marker in original: original = original[:original.find(marker)] # 保存新内容 with open(models_path, 'w', encoding='utf-8') as f: f.write(original + futures_split_tables) print('Futures split tables appended successfully!') if __name__ == "__main__": main()