[英]SQLAlchemy select from two tables with null LEFT JOIN returns empty result
我有兩個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
然后我收到[(None, None)]
而不是接收[(<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.*
)並且存在添加了null的LEFT JOIN時。
問題是您的表具有相同名稱的列。 執行查詢后,SqlAlchemy嘗試按名稱(而不是位置)匹配結果列,並選擇一些匹配的匹配(在這種情況下,表2的SA匹配列與表1的字段相反,反之亦然)。 有一種方法可以指定與.columns()方法的匹配,但我建議你盡可能考慮使用SqlAlchemy的orm-functions ,除非你有充分的理由反對它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.