Я прохожу учебник по SQLAlchemy ORM и немного запутался в разделе «Запросы с объединениями» (https://docs.sqlalchemy.org/en/latest/orm/tutorial.html#querying-with-joins).
Схема, которую ранее установил учебник, представляет собой простую схему из двух таблиц, где Address.user_id
- это внешний ключ для User.id
. В объекте Address он установлен как user_id = Column(Integer, ForeignKey('users.id'))
.
Базовый синтаксис соединения имеет смысл для меня:
session.query(User).join(Address).filter(Address.email_address=='jack@google.com').all()
Тем не менее, учебник затем делает заявление: Если не было внешних ключей или их несколько, Query.join () работает лучше, когда используется одна из следующих форм:
query.join(Address, User.id==Address.user_id) # explicit condition
query.join(User.addresses) # specify relationship from left to right
query.join(Address, User.addresses) # same, with explicit target
query.join('addresses') # same, using a string
Первый пример имеет смысл: если бы не было внешнего ключа или множественного числа, то нам нужно было бы помочь SQLAlchemy, явно указав условие соединения, так как он не мог определить из наших внешних ключей, какой из них использовать для выполнения соединения .
Однако последние три примера не имеют для меня никакого смысла. Я полагаю, что User.addresses
- это relationship
, который мы ранее настроили для нашего объекта User как relationship("Address", order_by=Address.id, back_populates="user")
, и он имеет аналог для объекта Address user = relationship("User", back_populates="addresses")
. Но в случае, когда нет внешних ключей или множественных, я не вижу, как определение конкретной декларации отношений действительно помогло бы нам.
По крайней мере, в этом руководстве объявления отношений сами по себе не определяют конкретный внешний ключ или отношение столбца, которое будет использоваться для реализации отношения. До сих пор, я думаю, это было просто неявное, что мы хотели, чтобы отношения использовали единый внешний ключ, который мы установили. Так есть ли другие случаи, когда в объекте отношений кодируется больше информации, то есть какое-то условие соединения? Это единственный способ увидеть, что указание relationship
даст достаточно информации для указания условия соединения, если между двумя таблицами ноль или более одного внешнего ключа.