Как добавить предложение where в объединение sqlalchemy? - PullRequest
0 голосов
/ 07 мая 2019

Я ищу запрос, такой как:

SELECT DISTINCT entity_rel.eidsub AS eidsub, entity_user_client.eidclient AS eidclient 
FROM entity_user_client
LEFT OUTER JOIN entity_rel ON entity_user_client.eidclient = entity_rel.eidobj AND entity_rel.reltype = :reltype_1 
LEFT OUTER JOIN entity_client ON entity_user_client.eidclient = entity_client.entityid
WHERE entity_user_client.eiduser IN (:userid_1)

со следующим кодом:

euc_query = select(
        [EntityRel.c.eidsub, EntityUserClient.c.eidclient]
    ).distinct().select_from(
        EntityUserClient
    ).outerjoin(
        EntityRel,
        (EntityUserClient.c.eidclient == EntityRel.c.eidobj) & (
                EntityRel.c.reltype == 51)
    ).outerjoin(
        EntityClient,
        EntityUserClient.c.eidclient == EntityClient.c.entityid
    )

    if user_ids:  # filter by user
        euc_query = euc_query.where(EntityUserClient.c.eiduser.in_(user_ids))

но выдает ошибку:

AttributeError: у объекта 'Join' нет атрибута 'где'

Также вокруг выбора есть обернутый парантез:

(SELECT DISTINCT entity_rel.eidsub AS eidsub, entity_user_client.eidclient AS eidclient 
FROM entity_user_client)
LEFT ...

которого не должно быть там, от которого я не знаю, как избавиться: (

1 Ответ

1 голос
/ 07 мая 2019

Соединения должны быть сделаны до EntityUserClient и заключены в select_from(): E.g.:

user_ids = (1, 2, 3, 4, 5)
euc_query = select(
        [EntityRel.c.eidsub, EntityUserClient.c.eidclient]
    ).distinct().select_from(
        EntityUserClient.outerjoin(
            EntityRel,
            (EntityUserClient.c.eidclient == EntityRel.c.eidobj) & (
                EntityRel.c.reltype == 51)
        ).outerjoin(
            EntityClient,
            EntityUserClient.c.eidclient == EntityClient.c.entityid
        )
    )
if user_ids:  # filter by user
    euc_query = euc_query.where(EntityUserClient.c.eiduser.in_(user_ids))

print(euc_query)

производит:

SELECT DISTINCT entity_rel.eidsub, entity_user_client.eidclient
FROM entity_user_client LEFT OUTER JOIN entity_rel ON entity_user_client.eidclient = entity_rel.eidobj AND entity_rel.reltype = :reltype_1 LEFT OUTER JOIN entity_client ON entity_user_client.eidclient = entity_client.entityid
WHERE entity_user_client.eiduser IN (:eiduser_1, :eiduser_2, :eiduser_3, :eiduser_4, :eiduser_5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...