| import os
|
| from sqlalchemy import create_engine, Column, Integer, String, Float, DateTime, Text, JSON
|
| from sqlalchemy.ext.declarative import declarative_base
|
| from sqlalchemy.orm import sessionmaker
|
| from datetime import datetime
|
|
|
|
|
| DATABASE_URL = os.getenv('DATABASE_URL', 'sqlite:///data/stock_analyzer.db')
|
| USE_DATABASE = os.getenv('USE_DATABASE', 'False').lower() == 'true'
|
|
|
|
|
| engine = create_engine(DATABASE_URL)
|
| Base = declarative_base()
|
|
|
|
|
|
|
| class StockInfo(Base):
|
| __tablename__ = 'stock_info'
|
|
|
| id = Column(Integer, primary_key=True)
|
| stock_code = Column(String(10), nullable=False, index=True)
|
| stock_name = Column(String(50))
|
| market_type = Column(String(5))
|
| industry = Column(String(50))
|
| updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
|
|
|
| def to_dict(self):
|
| return {
|
| 'stock_code': self.stock_code,
|
| 'stock_name': self.stock_name,
|
| 'market_type': self.market_type,
|
| 'industry': self.industry,
|
| 'updated_at': self.updated_at.strftime('%Y-%m-%d %H:%M:%S') if self.updated_at else None
|
| }
|
|
|
|
|
| class AnalysisResult(Base):
|
| __tablename__ = 'analysis_results'
|
|
|
| id = Column(Integer, primary_key=True)
|
| stock_code = Column(String(10), nullable=False, index=True)
|
| market_type = Column(String(5))
|
| analysis_date = Column(DateTime, default=datetime.now)
|
| score = Column(Float)
|
| recommendation = Column(String(100))
|
| technical_data = Column(JSON)
|
| fundamental_data = Column(JSON)
|
| capital_flow_data = Column(JSON)
|
| ai_analysis = Column(Text)
|
|
|
| def to_dict(self):
|
| return {
|
| 'stock_code': self.stock_code,
|
| 'market_type': self.market_type,
|
| 'analysis_date': self.analysis_date.strftime('%Y-%m-%d %H:%M:%S') if self.analysis_date else None,
|
| 'score': self.score,
|
| 'recommendation': self.recommendation,
|
| 'technical_data': self.technical_data,
|
| 'fundamental_data': self.fundamental_data,
|
| 'capital_flow_data': self.capital_flow_data,
|
| 'ai_analysis': self.ai_analysis
|
| }
|
|
|
|
|
| class Portfolio(Base):
|
| __tablename__ = 'portfolios'
|
|
|
| id = Column(Integer, primary_key=True)
|
| user_id = Column(String(50), nullable=False, index=True)
|
| name = Column(String(100))
|
| created_at = Column(DateTime, default=datetime.now)
|
| updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
|
| stocks = Column(JSON)
|
|
|
| def to_dict(self):
|
| return {
|
| 'id': self.id,
|
| 'user_id': self.user_id,
|
| 'name': self.name,
|
| 'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S') if self.created_at else None,
|
| 'updated_at': self.updated_at.strftime('%Y-%m-%d %H:%M:%S') if self.updated_at else None,
|
| 'stocks': self.stocks
|
| }
|
|
|
|
|
|
|
| Session = sessionmaker(bind=engine)
|
|
|
|
|
|
|
| def init_db():
|
| Base.metadata.create_all(engine)
|
|
|
|
|
|
|
| def get_session():
|
| return Session()
|
|
|
|
|
|
|
| if USE_DATABASE:
|
| init_db() |