在SQLAlchemy的存在文檔說,使用exists創(chuàng)建了一個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')) ...我想進行這需要讓所有的復(fù)雜查詢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當(dāng)基礎(chǔ)查詢執(zhí)行 a 時,為什么存在SELECT <column>?我希望查詢做的是SELECT query_id FROM reviews在帶有EXISTS子句的查詢中。我怎樣才能做到這一點?
1 回答

慕的地8271018
TA貢獻1796條經(jīng)驗 獲得超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)
我使用這些函數(shù).enable_eagerloads(False).with_labels().statement是因為它們用于底層實現(xiàn),exists我認為它們可以提高性能(盡管我不確定也沒有深入研究)。
添加回答
舉報
0/150
提交
取消