簡體   English   中英

針對視圖的SQLAlchemy查詢未返回完整結果

[英]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)

在ORM教程的“添加和更新對象”“合並的負載”下,提到並推理了這種隱式的“與眾不同

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM