Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在3个表上执行SQLAlchemy中的联接,其中一个表是其他两个表之间的映射?_Python_Sql_Sqlalchemy - Fatal编程技术网

Python 如何在3个表上执行SQLAlchemy中的联接,其中一个表是其他两个表之间的映射?

Python 如何在3个表上执行SQLAlchemy中的联接,其中一个表是其他两个表之间的映射?,python,sql,sqlalchemy,Python,Sql,Sqlalchemy,假设我有以下表格: 文章带有字段文章id,标题 标记带有字段标记id,名称 ArticleTags带有字段article\u id,tag\u 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

假设我有以下表格:

  • 文章
    带有字段
    文章id
    标题
  • 标记
    带有字段
    标记id
    名称
  • ArticleTags
    带有字段
    article\u id
    tag\u 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。

假设您正确设置了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表达式语言,它应该是可直接翻译的。

看起来不错。但是有一个问题-我没有将
ArticleTags
映射到任何类。我只是在
Articles
Tags
映射类的第二个子句中使用
ArticleTags
。我是否应该将
ArticleTags
映射到一个类?如果这不起作用,您必须给出模型的相关部分。您的第二个解决方案可行,但我注意到它进行了子选择。子选择是否正常?