我有一个等同于以下查询的SQLAlchemy表达式:
SELECT *
FROM T1
WHERE (...)
我想修改表达式,使其等同于此查询:
SELECT *
FROM T1 JOIN T2 ON T1.id=T2.id
WHERE (...)
编辑:为了澄清,我问如何修改已经存在的表达式对象,而不是如何创建新的表达式对象。
答案 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 *
现在会返回T1
和T2
的列。