sqlalchemy 和双外连接

Posted

技术标签:

【中文标题】sqlalchemy 和双外连接【英文标题】:sqlalchemy and double outerjoin 【发布时间】:2013-03-13 08:09:02 【问题描述】:

我需要对以下 2 个表 A 和 B 进行双重外连接以获得呈现的结果 使用 SQLAlchemy ORM 或 SQL 表达式。

表 B 应该被外部连接两次,以获得相同的 A 记录的连接 2 个结果集(由 c_id 区分)。外连接用于在第一个 (c_id = 66) 或第二个 (c_id = 70) 外连接中缺少 B 结果的情况下获取 NULL。

一张桌子:

id
--
1
2
3
4

B表:

id | a_id | c_id
---+------+------
1  |  1   | 66
2  |  2   | 66
3  |  3   | 70
4  |  4   | 66
5  |  4   | 70

查询结果应该是:

a_id | b1_id (66) | b2_id (70)
-----+------------+-----------
 1   |  1         |  NULL
 2   |  2         |  NULL
 3   |  NULL      |  3
 4   |  4         |  5

我知道正确的原始 SQL 查询如下所示:

SELECT 
  A.id AS a_id,
  B_1.id AS b1_id, 
  B_2.id AS b2_id,  
FROM 
  A
LEFT OUTER JOIN   B AS B_1  ON A.id = B_1.a_id AND B_1.c_id = 66
LEFT OUTER JOIN   B AS B_2  ON A.id = B_2.a_id AND B_2.c_id = 70
WHERE
  B_1.id is not NULL or 
  B_2.id is not NULL;

现在,您知道如何在 SA ORM 或 SA SQL 表达式中对此进行编码吗?

【问题讨论】:

【参考方案1】:

自己找到了解决方案:

b1 = aliased(B)
b2 = aliased(B)
q = session.query(A.id, b1.id.label("b1_id"), b1.id.label("b2_id"))
q = q.outerjoin(b1, sqlalchemy.and_(A.id == b1.a_id, b1.c_id == 66))
q = q.outerjoin(b2, sqlalchemy.and_(A.id == b2.a_id, b2.c_id == 70))
q = q.filter(sqlalchemy.or_(b1.id != None, b2.id != None))

【讨论】:

以上是关于sqlalchemy 和双外连接的主要内容,如果未能解决你的问题,请参考以下文章

无法从 sqlalchemy 插入到 mysql

python flask orm sqlalchemy 实例

python flask orm sqlalchemy 实例

Flask-SQLAlchemy 的隔离级别

爱上 SQLAlchemy 的 10 个理由(转)

Flask 进阶系列:SQLAlchemy 扩展学习