SQLAlchemy объединиться и присоединиться - PullRequest
0 голосов
/ 06 ноября 2018

У меня много проблем с преобразованием моего sql-запроса в sqlalchemy. Я не смог найти никаких ресурсов, делающих то, что я пытаюсь сделать.

Запрос, который я пытаюсь преобразовать:

SELECT 
     COALESCE(d.manager_name, e.name) AS name,
     COALESCE(d.department_name, e.department_name) AS department
FROM employee e
LEFT JOIN department d ON e.id = d.id 
WHERE e.date = '2018-11-05'

В sqlalchemy я придумал:

  query = self.session.query(
            func.coalesce(Department.manager_name, Employee.name),
            func.coalesce(Department.department_name, Employee.department_name)).join(Department, 
                    Employee.id == Department.id,
                ).filter(
                    Employee.date == '2018-11-05',
                )

Но продолжайте получать ошибку:

sqlalchemy.exc.InvalidRequestError: Can't join table/selectable 'Department' to itself.

ПОЧЕМУ ?! Заявления точны!

1 Ответ

0 голосов
/ 06 ноября 2018

Поскольку Department - самый левый элемент в вашем запросе, соединения выполняются против него. Для управления тем, что считается первым - или «левым» - объектом в соединении, используйте Query.select_from():

query = self.session.query(
        func.coalesce(Department.manager_name, Employee.name),
        func.coalesce(Department.department_name, Employee.department_name)).\
    select_from(Employee).\
    outerjoin(Department, Employee.id == Department.id).\
    filter(Employee.date == '2018-11-05')

Это поведение также объясняется в руководстве ORM под «Запросы с объединениями» и Query.join(): «Управление тем, к чему присоединяться» .

Ваша конструкция запроса также использовала Query.join(), хотя в сыром SQL было LEFT JOIN. В этом случае следует использовать Query.outerjoin() или join(..., isouter=True).

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