我有两个sql表。 表1(id,name)和表2(id,name,table1_id)
sql = text('SELECT t1.*, t2.* FROM table1 t1 '
'LEFT JOIN table2 t2 ON t1.id=t2.table1_id ')
query = db.session.query(Table1, Table2).from_statement(sql).params()
table1_table2_tuple_list = query.all()
如果sql查询的结果是
67, 'some name', 1, 'some name in table 2', 67
然后一切正常我有[(<Table1>, <Table2>)]
for table1_table2_tuple_list
但是 如果sql查询的结果是:(也是所有其他代码都是针对此结果)
67, 'some name', Null, Null, Null
然后而不是接收[(<Table1>, None)]
我收到了[(None, None)]
如果我稍微改变我的代码:
sql = text('SELECT t1.*, t2.id, t2.name,t1.id FROM table1 t1 '
'LEFT JOIN table2 t2 ON t1.id=t2.table1_id ')
query = db.session.query(Table1, Table2, Table1.id).from_statement(sql).params()
table1_table2_tuple_list = query.all()
然后我收到:
[<Table1>, <Table2>, 1]
但在这种情况下,我甚至不确定这是否正确,因为我将sql中的两列匹配到具有三列的Table2模型。不知道为什么这是有效的,但一切似乎都到位。仍然不是我想要的,因为我不想返回到这个查询并一次又一次地指定新列,如果有这样的表2
我需要的是一种从纯sql中选择两个表的方法,并将结果与我的模型匹配。即使在其中一个表的结果列中没有值的情况下,我也希望得到结果。希望我很清楚。我的目标是接收
[(<Table1>, None)]
当查询针对所有列(SELECT t1.*, t2.*
)并且存在LEFT JOIN且添加了null。
答案 0 :(得分:12)
问题是您的表具有相同名称的列。执行查询后,SqlAlchemy尝试按名称(而不是位置)匹配结果列,并选择一些匹配的匹配(在这种情况下,表2的SA匹配列与表1的字段相反,反之亦然)。有一种方法可以指定与.columns() method的匹配,但我建议你尽可能考虑使用orm-functions的SqlAlchemy,除非你有充分的理由反对它。