在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我认为它们可以提高性能(尽管我不确定也没有深入研究)。
添加回答
举报
0/150
提交
取消