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