为了账号安全,请及时绑定邮箱和手机立即绑定

如何在sqlalchemy中选择列存在

如何在sqlalchemy中选择列存在

江户川乱折腾 2021-12-21 16:07:32
在SQLAlchemy的存在文档说,使用exists创建了一个SQL语句EXISTS (SELECT 1 ...)。我怎样才能EXISTS选择我选择的列?我有两个模型喜欢这样:class Query:    id = Column(UUID)    content = Column(String)    ...class Review:    id = Column(UUID)    query_id = Column(UUID, ForeignKey('query.id'))    ...我想进行这需要让所有的复杂查询id小号QueryS的没有Review。为此,我编写了以下 python:reviewed_query_ids_sql_query = session.query(models.Review.query_id)filtered_queries_sql_query = session.query(models.Query.id).where(~reviewed_query_ids_sql_query.exists())但这会为以下生成以下 SQL filtered_queries_sql_query:SELECT queries.id FROM queries WHERE (EXISTS (SELECT 1 FROM reviews))但是,原始查询reviewed_query_ids_sql_query是SELECT reviews.query_id AS reviews_query_id FROM reviewsSELECT 1当基础查询执行 a 时,为什么存在SELECT <column>?我希望查询做的是SELECT query_id FROM reviews在带有EXISTS子句的查询中。我怎样才能做到这一点?
查看完整描述

1 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

我找到了一个解决方案,但我不确定它是否是最佳的:


from sqlalchemy import exists


reviewed_query_ids_sql_query = ~exists(

    session.query(models.Review.query_id)

        .filter(models.Query.id == models.Review.query_id)

        .enable_eagerloads(False).with_labels().statement)


filtered_queries_sql_query = session.query(models.Query.id).where(reviewed_query_ids_sql_query)

我使用这些函数.enable_eagerloads(False).with_labels().statement是因为它们用于底层实现,exists我认为它们可以提高性能(尽管我不确定也没有深入研究)。


查看完整回答
反对 回复 2021-12-21
  • 1 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号