【问题标题】:SQLAlchemy select from two tables with null LEFT JOIN returns empty resultSQLAlchemy 从具有空左连接的两个表中选择返回空结果
【发布时间】:2018-05-05 14:51:14
【问题描述】:

我有两个 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 匹配。完全不知道为什么这是有效的,但一切似乎都到位了。仍然不是我想要的,因为我不想返回此查询并一次又一次地指定新列(如果 Table2 有这样的列)

我需要的是一种使用纯 sql 从两个表中进行选择并将结果与​​我的模型相匹配的方法。即使在其中一个表的结果列中没有值的情况下,我也希望得到结果。希望我清楚。我的目标是收到

[(<Table1>, None)]

当查询针对所有列 (SELECT t1.*, t2.*) 并且添加了 LEFT JOIN 时。

【问题讨论】:

    标签: python sqlalchemy flask-sqlalchemy


    【解决方案1】:

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

    【讨论】:

    • 谢谢。我就是这样。可惜没有办法。这就像指定名为“id”的分隔列一样简单,它适用于 80% 的情况。真的很遗憾没有选择。我擅长纯 sql,这对我来说很重要。
    • 不客气。可以选择使用纯 sql,但您应该明确映射到您的模型。虽然,我认为无论如何这是一个巨大的开销。试试 orm-syntax,它看起来与 sql 非常相似,并且有大量文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 2013-12-19
    • 1970-01-01
    相关资源
    最近更新 更多