如何在3个表上的SQLAlchemy中进行JOIN,其中一个表是在其他两个表之间进行映射的?

时间:2010-01-31 19:36:18

标签: python sql sqlalchemy

假设我有以下表格:

  • Articles包含字段article_idtitle
  • Tags包含字段tag_idname
  • ArticleTags包含字段article_idtag_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。

有人可以帮忙吗?

谢谢,Boda Cydo。

1 个答案:

答案 0 :(得分:8)

假设您正确设置了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'))

有关博客相关查询的更多示例,请查看here

如果您使用sql表达式语言,它应该是直接可转换的。