"""数据库表定义""" from sqlalchemy import ( MetaData, Table, Column, Integer, Float, Text, Boolean, DateTime, func ) metadata = MetaData() recommendations_table = Table( "recommendations", metadata, Column("id", Integer, primary_key=True, autoincrement=True), Column("ts_code", Text, nullable=False), Column("name", Text, nullable=False), Column("sector", Text), Column("score", Float), Column("market_temp_score", Float), Column("sector_score", Float), Column("capital_score", Float), Column("technical_score", Float), Column("supply_demand_score", Float, default=0), Column("price_action_score", Float, default=0), Column("position_score", Float), Column("valuation_score", Float), Column("signal", Text), Column("entry_price", Float), Column("target_price", Float), Column("stop_loss", Float), Column("reasons", Text), Column("llm_analysis", Text, default=""), Column("strategy", Text, default="trend_breakout"), Column("entry_signal_type", Text, default="none"), Column("llm_score", Float, default=None), Column("scan_session", Text), Column("created_at", DateTime, server_default=func.now()), ) sector_heat_table = Table( "sector_heat", metadata, Column("id", Integer, primary_key=True, autoincrement=True), Column("sector_code", Text, nullable=False), Column("sector_name", Text, nullable=False), Column("pct_change", Float), Column("capital_inflow", Float), Column("limit_up_count", Integer), Column("heat_score", Float), Column("stage", Text), Column("days_continuous", Integer), Column("member_count", Integer), Column("leading_stocks", Text), # JSON string Column("pct_trend", Text), # JSON string Column("turnover_avg", Float), Column("main_force_ratio", Float), Column("trade_date", Text, nullable=False), Column("created_at", DateTime, server_default=func.now()), ) market_temperature_table = Table( "market_temperature", metadata, Column("id", Integer, primary_key=True, autoincrement=True), Column("trade_date", Text, nullable=False, unique=True), Column("up_count", Integer), Column("down_count", Integer), Column("limit_up_count", Integer), Column("limit_down_count", Integer), Column("max_streak", Integer), Column("broken_rate", Float), Column("temperature", Float), Column("created_at", DateTime, server_default=func.now()), ) recommendation_tracking_table = Table( "recommendation_tracking", metadata, Column("id", Integer, primary_key=True, autoincrement=True), Column("recommendation_id", Integer), Column("track_date", Text, nullable=False), Column("current_price", Float), Column("pct_from_entry", Float), Column("hit_target", Boolean, default=False), Column("hit_stop_loss", Boolean, default=False), Column("status", Text, default="active"), Column("created_at", DateTime, server_default=func.now()), ) users_table = Table( "users", metadata, Column("id", Integer, primary_key=True, autoincrement=True), Column("username", Text, nullable=False, unique=True), Column("password_hash", Text, nullable=False), Column("role", Text, default="user"), Column("is_active", Boolean, default=True), Column("created_at", DateTime, server_default=func.now()), Column("updated_at", DateTime, server_default=func.now()), ) daily_reviews_table = Table( "daily_reviews", metadata, Column("id", Integer, primary_key=True, autoincrement=True), Column("trade_date", Text, nullable=False, unique=True), Column("content", Text, default=""), Column("created_at", DateTime, server_default=func.now()), ) stock_diagnoses_table = Table( "stock_diagnoses", metadata, Column("id", Integer, primary_key=True, autoincrement=True), Column("ts_code", Text, nullable=False), Column("name", Text, nullable=False), Column("diagnosis", Text, nullable=False), Column("created_at", DateTime, server_default=func.now()), )