Как сделать JOIN в SQLAlchemy на 3 таблицы, где одна из них отображается между двумя другими? - PullRequest
9 голосов
/ 31 января 2010

Предположим, у меня есть следующие таблицы:

  • Articles с полями article_id, title
  • Tags с полями tag_id, name
  • ArticleTags с полями article_id, tag_id

И я хочу найти все статьи, которые имеют данный тег. Как мне создать это сложное объединение в SQLAlchemy?

В SQL это будет выглядеть так:

SELECT a.article_id, a.title FROM Articles AS a
JOIN ArticleTags AS at ON a.article_id  = at.article_id
JOIN Tags        AS t  ON at.tag_id = t.tag_id
WHERE t.name = 'tag_name'

Я не могу понять, как это сделать в SQLAlchemy. Я использую ArticleTags только как «вторичную» таблицу и не могу понять, как включить ее в JOIN.

Может кто-нибудь помочь?

Спасибо, Бода Цидо.

1 Ответ

8 голосов
/ 31 января 2010

Предполагая, что вы правильно установили ограничения ForeignKey и создали мапперы:

q = Session.query(Articles).filter(Articles.article_id == ArticleTags.article_id).\
    filter(ArticleTags.tag_id == Tags.tag_id).\
    filter(Tags.name == 'tag_name')

Если вы установили отношение «многие ко многим», это еще проще:

q = Session.query(Articles).filter(Articles.tags.any(name = 'tag_name'))

Еще несколько примеров запросов, связанных с блогами, смотрите здесь .

Если вы используете язык выражений sql, он должен быть переведен напрямую.

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