SQLAlchemy从两个表中选择null LEFT JOIN返回空结果

时间:2018-05-02 20:01:01

标签: python sqlalchemy flask-sqlalchemy

我有两个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。

1 个答案:

答案 0 :(得分:12)

问题是您的表具有相同名称的列。执行查询后,SqlAlchemy尝试按名称(而不是位置)匹配结果列,并选择一些匹配的匹配(在这种情况下,表2的SA匹配列与表1的字段相反,反之亦然)。有一种方法可以指定与.columns() method的匹配,但我建议你尽可能考虑使用orm-functions的SqlAlchemy,除非你有充分的理由反对它。