如何在sqlalchemy中选择列存在

在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 reviews

SELECT 1当基础查询执行 a 时,为什么存在SELECT <column>?我希望查询做的是SELECT query_id FROM reviews在带有EXISTS子句的查询中。我怎样才能做到这一点?


江户川乱折腾
浏览 167回答 1
1回答

慕的地8271018

我找到了一个解决方案,但我不确定它是否是最佳的:from sqlalchemy import existsreviewed_query_ids_sql_query = ~exists(&nbsp; &nbsp; session.query(models.Review.query_id)&nbsp; &nbsp; &nbsp; &nbsp; .filter(models.Query.id == models.Review.query_id)&nbsp; &nbsp; &nbsp; &nbsp; .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我认为它们可以提高性能(尽管我不确定也没有深入研究)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python