如何在sqlalchemy中选择列

时间:2019-03-29 05:26:27

标签: python sql sqlalchemy

SQLAlchemy exists docs说,使用exists使用EXISTS (SELECT 1 ...)创建一个SQL语句。如何获得EXISTS来选择自己选择的列?

我有两个喜欢的模特:

class Query:
    id = Column(UUID)
    content = Column(String)
    ...

class Review:
    id = Column(UUID)
    query_id = Column(UUID, ForeignKey('query.id'))
    ...

我正在尝试执行一个复杂的查询,该查询要求获取所有id个没有Query的{​​{1}}个。为此,我编写了以下python:

Review

但这会为 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为何存在?我想要查询执行的操作是在查询中使用SELECT <column>子句的SELECT query_id FROM reviews。我该如何实现?

1 个答案:

答案 0 :(得分:0)

我找到了解决方案,尽管不确定是否最佳:

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的基础实现中,并且我认为它们可以提高性能(尽管我不确定,也没有深入研究)。