Как выбрать столбец в sqlalchemy существует - PullRequest
0 голосов
/ 29 марта 2019

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 s Query s, которые не имеют 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, когда базовый запрос выполняет SELECT <column>? Что бы я хотел сделать для запроса, это SELECT query_id FROM reviews в запросе с предложением EXISTS. Как мне этого добиться?

1 Ответ

0 голосов
/ 29 марта 2019

Я нашел решение, хотя я не уверен, что оно оптимально:

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, и я думаю, что они улучшают производительность (хотя я не уверен и не копался).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...