クエリのすべての結果を取得したいと思います。私のコードは次のようになります:
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()
、1行しか表示されません(つまり、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) であるため、問題を引き起こしました。