我想檢索查詢的所有結果。我的代碼如下所示:查詢SQLAlchemy中的所有結果0.7.10
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)。
您可以發佈完整的「Something」類定義以及從execute()返回的幾條記錄嗎? –
啊哈,實際上你的建議幫我解決了這個問題,當我試圖製作一個我的班級玩具的例子。 問題是我的主鍵不是唯一的。這對count()是可以的,但顯然SQL Alchemy只會返回主鍵的第一個實例,如果它不是唯一的。我並不期待這種行爲。 謝謝! – Max
沒問題,我認爲這是問題所在。對於未來發生在這個問題上的人,我寫了一個稍微更復雜的答案。 –