如何在SQLAlchemy中对三个表进行JOIN,其中一个是另两个表的映射?

10 投票
1 回答
9800 浏览
提问于 2025-04-15 18:42

假设我有以下几个表:

  • 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 表当作“辅助”表使用,但我不知道怎么把它包含在连接中。

有人能帮忙吗?

谢谢,Boda Cydo。

1 个回答

9

假设你已经正确设置了外键约束,并且创建了映射器:

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表达式语言,那应该很容易转换。

撰写回答