Разница в SQLAlchemy между contains_eager и joinload - PullRequest
0 голосов
/ 05 мая 2018

В чем разница в SQLAlchemy между contains_eager и joinedload. Я прочитал руководство о contains_eager и руководство о joinload. Оба они могут использоваться для загрузки связанных строк «один ко многим» или «многие к одному».

они генерируют тот же sql:

query = session.query(User).\
    outerjoin(adalias, User.addresses).\
    options(contains_eager(User.addresses, alias=adalias)).all()

...

SELECT
    users.user_id AS users_user_id,
    users.user_name AS users_user_name,
    adalias.address_id AS adalias_address_id,
    adalias.user_id AS adalias_user_id,
    adalias.email_address AS adalias_email_address,
    (...other columns...)
FROM users
LEFT OUTER JOIN email_addresses AS email_addresses_1
ON users.user_id = email_addresses_1.user_id


>>> jack = session.query(User).\
... options(joinedload(User.addresses)).\
... filter_by(name='jack').all()

SELECT
    addresses_1.id AS addresses_1_id,
    addresses_1.email_address AS addresses_1_email_address,
    addresses_1.user_id AS addresses_1_user_id,
    users.id AS users_id, users.name AS users_name,
    users.fullname AS users_fullname,
    users.password AS users_password
FROM users
LEFT OUTER JOIN addresses AS addresses_1
    ON users.id = addresses_1.user_id
WHERE users.name = ?
['jack']

Кто-нибудь может показать более конкретные примеры кода?

1 Ответ

0 голосов
/ 05 мая 2018

Не забывайте много ко многим и один к одному. Разница в том, что с contains_eager() вы указываете SQLA о существующем соединении или объединениях, которые следует использовать для заполнения отношений. Таким образом, вы также можете заполнить, используя отфильтрованное подмножество .

joinedload(), с другой стороны, делает все возможное, чтобы объединения, необходимые для заполнения, были полностью прозрачными, и они не должны влиять на исход исходного запроса, как объяснено в Zen of Joined Eager Loading . Другими словами, вы не можете использовать объединенные отношения для фильтрации и т. Д.

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