【发布时间】:2021-07-07 00:13:09
【问题描述】:
有没有办法使用一条 SQLAlchemy 查询语句在 Index 表中查找相应的 ID 并从 DimIndexPrice 表中过滤这些行而不使用两条语句?
我觉得我没有通过使用两个语句来使用 SQLAlchemy 的全部表现力。我是 SQL 的初学者,但 union 和 join 在这里没有意义,所以也许这是正确的设计模式。
q = 'VOO'
first_query = db_session.query(Index).filter_by(Symbol=q).first()
second_query = db_session.query(DimIndexPrice).filter_by(IndexID=first_query.ID)
class Index(Base):
__tablename__ = 'Index'
ID = Column(Integer, primary_key=True, autoincrement=True)
Symbol = Column(String(4), unique=True, nullable=False)
FundName = Column(String(120), unique=True, nullable=False)
def __init__(self, Symbol, FundName):
self.Symbol = Symbol
self.FundName = FundName
def __repr__(self):
return '<Index %r>' % (self.Symbol)
class DimIndexPrice(Base):
__tablename__ = 'DimIndexPrice'
ID = Column(Integer, primary_key=True, autoincrement=True)
IndexID = Column(Integer, ForeignKey('Index.ID'), nullable=False)
Date = Column(Date(), nullable=False)
Open = Column(Float, nullable=False)
High = Column(Float, nullable=False)
Low =Column(Float, nullable=False)
Close = Column(Float, nullable=False)
CloseAdjusted = Column(Float, nullable=False)
Volume = Column(Integer, nullable=False)
DividendAmount = Column(Float, nullable=False)
SplitCoefficient = Column(Float, nullable=False)
def __init__(self,
IndexID,
Date,
Open,
High,
Low,
Close,
CloseAdjusted,
Volume,
DividendAmount,
SplitCoefficient):
self.IndexID = IndexID
self.Date = Date
self.Open = Open
self.High = High
self.Low = Low
self.Close = Close
self.CloseAdjusted = CloseAdjusted
self.Volume = Volume
self.DividendAmount = DividendAmount
self.SplitCoefficient = SplitCoefficient
def __repr__(self):
return '<DimIndexPrice %r %s>' % (self.IndexID, self.Date)
【问题讨论】:
-
这似乎是一个 JOIN 确实是正确的做法
-
@sabik 需要解释一下吗?我需要查询第一个表以获取输入的 ID,然后在第二个表中按此 ID 进行过滤。
-
是的,这就是 JOIN 的作用
-
在ID上JOIN两个表,然后在Symbol上过滤
-
数据库引擎会根据需要自动交换操作顺序以提高效率
标签: python sql sqlalchemy