我想检索查询的所有结果。我的代码如下所示:
engine = sqlalchemy.create_engine(...)
Base = declarative_base()
class Something(Base):
...
Session = sessionmaker(bind=engine)
session = Session()
query = session.query(Something).filter(...).all()
我明白了query.count() == 3000
,但是当我尝试时results = query.all()
,我只得到一行(即len(results) == 1
)。
我的理解是query.all()
执行查询并返回所有结果的列表。我在这里错过了什么吗?计算的行数大于返回的行数的一些可能原因是什么?
编辑(更多细节):
获取原始 SQL(例如查看str(query)
并进行参数替换)并将其传递给它session.execute
似乎工作得很好:
# this gives 3000 rows
for row in session.execute(raw_sql, {'param1': val1, 'param2': val2}):
print(row)
解决方案
原来问题是我的主键不是唯一的。经验教训:设置课程时要非常小心!就我而言,我有:
class Something(Base):
row_id_1 = Column(Integer, primary_key=True)
row_id_2 = Column(Integer) # PROBLEM! Need to specify primary_key=True
value = Column(Float)
这会导致问题,因为主键是组合(row_id_1,row_id_2)。