如何修改SQLAlchemy表达式的join子句?

时间:2014-01-18 16:12:14

标签: sql sqlalchemy

我有一个等同于以下查询的SQLAlchemy表达式:

SELECT *
FROM T1
WHERE (...)

我想修改表达式,使其等同于此查询:

SELECT *
FROM T1 JOIN T2 ON T1.id=T2.id 
WHERE (...)

编辑:为了澄清,我问如何修改已经存在的表达式对象,而不是如何创建新的表达式对象。

1 个答案:

答案 0 :(得分:0)

# ORM version: T1 and T2 are mapped classes
q_old = session.query(T1, T2).filter(T1.id == T2.id).filter("mycondition")
print q_old
q_new = session.query(T1, T2).join(T2, T1.id == T2.id).filter("mycondition")
print q_new

# Core version: T1 and T2 are Table(...)
s_old = select("*").select_from(T1).where("mycondition")
print s_old
s_new = select("*").select_from(T1.join(T2, T1.c.id==T2.c.id)).where("mycondition")
print s_new

我建议不要使用SELECT *,建议改用select([T1, T2])

更新:要从s_old转到s_new,您可以尝试以下操作:

assert len(s_old._from_obj) == 1
T1inferred = s_old._from_obj[0]
s_upd = s_old.select_from(T1inferred.join(T2, T1inferred.c.id==T2.c.id))
print s_upd

基本上,您尝试从给定的T1获取s_old,以便您可以构建联接,同时保留where条件。 请注意,SELECT *现在会返回T1T2的列。