вопрос о выборе целей объединения SQLAlchemy - PullRequest
0 голосов
/ 14 апреля 2019

Я прохожу учебник по SQLAlchemy ORM (https://docs.sqlalchemy.org/en/latest/orm/tutorial.html#querying-with-joins)), и есть часть, которая смутила меня больше, чем помогла мне:

Что выбирает Query, если есть несколько сущностей?

Метод Query.join () обычно присоединяется к крайнему левому элементу в списке объектов, когда предложение ON пропущено или если предложение ON является простым выражением SQL. Для управления первым объектомв списке JOIN используйте метод Query.select_from ():

query = session.query(User, Address).select_from(Address).join(User)

Является ли «список сущностей» списком в query()?

Более конкретно, когда предложение ON not будет опущено?

Под ON clause подразумевается ли отношение, подобное User.addresses (ранее определенное, например, как * 1023)*) используется как join(User.addresses)? Это тот тип «предложения ON», который не позволил бы нам нуждаться в select_from(), поскольку сам параметр join() будет содержать необходимую информацию для определения, к какой таблице мы собираемся присоединиться?

Конечно, должно бытькакой-то способ указать цели объединения, не устанавливая их по умолчанию на первую таблицу в query(), так как в противном случае было бы невозможно создать некоторые сложные запросы.

1 Ответ

2 голосов
/ 14 апреля 2019

Начнем с самого начала. Когда вы передаете элементы в query (), он будет создавать оператор SELECT из этих элементов. Если они являются моделями, то будут перечислены все поля таких моделей. Запрос автоматически добавит таблицы для выбора ОТ.

Если вы не укажете это, запрос не будет выполнять объединения автоматически, поэтому вы должны добавить предположить, из каких таблиц искать ваши значения. Дополнительные предложения, такие как join (), сообщают запросу, как должна выполняться операция JOIN.

Дополнительные аргументы для join () будут использоваться в качестве предложения ON, в противном случае запрос выведет предложение на основе определенных пользователем сопоставлений.

Таким образом, чтобы подвести итог, предложение ON опускается всякий раз, когда вы не указываете дополнительные аргументы для join (). В следующем выражении предложение ON опущено: query(User, Address).join(Address) Это не означает, что в отправляемом SQL не будет предложения ON; он будет делать правильные вещи, выводя правильное предложение ON, используя отношения, определенные в модели.

Если существует несколько возможностей, вам нужно указать это предложение самостоятельно: query(Person).join(Person.parent1).join(Person.parent2) должно привести к запросу, который возвращает человека и обоих его родителей. В этом случае предложение ON не было опущено.

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