|
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() |