[英]SQLAlchemy query against a view not returning full results
我在Flask Web應用程序中使用Flask-SQLAlchemy(flask_sqlalchemy == 2.3.2)。 對於普通表查詢,它的表現完美無缺,但是現在我正在過渡到將某些邏輯轉換為SQL視圖,而SQLAlchemy並未捕獲全部結果。
這是我的具體示例:
SQL視圖view_ticket_counts
:
CREATE VIEW view_ticket_counts AS
SELECT event_id, price_id, COUNT(1) AS ticket_count FROM public.tickets
GROUP BY event_id, price_id
當我使用pgAdmin將其作為常規SQL查詢運行時:
SELECT * FROM view_ticket_counts WHERE event_id=1
我得到結果:
|event_id|price_id|ticket_count|
| 1 | 1 | 3 |
| 1 | 2 | 1 |
但是,如果我像這樣運行python SQLAlchemy查詢:
ticket_counts = ViewTicketCounts.query.filter_by(event_id=1).all()
for tc in ticket_counts:
print(tc.event_id, tc.price_id, tc.ticket_count)
它只打印一個結果: 1 1 3
因此出於某種原因,即使使用.all()
,SQLAlchemy查詢或實現也只獲取第一個元素。
為了完成,這是我的View Model類:
class ViewTicketCounts(db.Model):
event_id = db.Column(BigInteger, primary_key=True)
price_id = db.Column(BigInteger)
ticket_count = db.Column(BigInteger)
您視圖的實際鍵是event_id, price_id
,而不僅僅是event_id,
您只看到第一行的原因是,在查詢模型對象/實體時,ORM會根據其主鍵為每個找到的行查詢身份映射 ,並且如果對象已包含在結果中,則將其跳過。 因此,在您處理第二行的情況下,SQLAlchemy發現具有主鍵1,
的對象已經存在於結果中,並且僅忽略該行(因為不涉及任何加入的緊急加載)。
解決方法很簡單:
class ViewTicketCounts(db.Model):
event_id = db.Column(BigInteger, primary_key=True)
price_id = db.Column(BigInteger, primary_key=True)
ticket_count = db.Column(BigInteger)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.