Фильтрация по объединенным таблицам - PullRequest
1 голос
/ 22 марта 2012

Я пытаюсь улучшить производительность некоторых запросов, но сгенерированный запрос не выглядит так, как я ожидаю.

Результаты извлекаются с использованием:

query = session.query(SomeModel).
        options(joinedload_all('foo.bar')).
        options(joinedload_all('foo.baz')).
        options(joinedload('quux.other'))

ЧтоЯ хочу сделать, это фильтр на таблице, присоединенной через 'first', но этот способ не работает:

query = query.filter(FooModel.address == '1.2.3.4')

Это приводит к такому предложению, прикрепленному к запросу:

WHERE foos.address = '1.2.3.4'

Который не выполняет фильтрацию должным образом, так как сгенерированные объединения присоединяют таблицы foos_1 и foos_2.Если я попытаюсь выполнить этот запрос вручную, но изменим условие фильтрации на:

WHERE foos_1.address = '1.2.3.4' AND foos_2.address = '1.2.3.4'

Он работает нормально.Вопрос, конечно, в том, как этого добиться с помощью самой sqlalchemy?

1 Ответ

5 голосов
/ 25 марта 2012

Если вы хотите фильтровать объединения, вы используете join ():

session.query(SomeModel).join(SomeModel.foos).filter(Foo.something=='bar')

joinload () и joinload_all () используются только как средство загрузки связанных коллекций за один проход, не используется для фильтрации / заказа! .Пожалуйста, прочитайте:

http://docs.sqlalchemy.org/en/latest/orm/tutorial.html#joined-load - примечание на "joinload () не заменяет join ()", а также:

http://docs.sqlalchemy.org/en/latest/orm/loading.html#the-zen-of-eager-loading

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