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