【问题标题】:SQLalchemy "load_only" doesn't load only the columns specifiedSQLalchemy“load_only”不只加载指定的列
【发布时间】:2023-04-05 07:51:01
【问题描述】:

我正在尝试使用 sqlalchemy 的 load_only 函数从表中选择列的子集。不幸的是,它似乎并不仅仅返回函数调用中指定的列 - 具体来说,它似乎还获取主键(在我的例子中,一个 auto_increment id 字段)。

一个简单的例子,如果我使用这个语句来构建一个查询:

query = session.query(table).options(load_only('col_1', 'col_2'))

那么query.statement 看起来像这样:

SELECT "table".id, "table"."col_1", "table"."col_2" 
FROM "table"

这不是我所期望的 - 鉴于我已经指定了要使用的“唯一”列...id 来自哪里 - 有没有办法删除它?

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    如果查询完整的 ORM 实体,推迟主键是没有意义的,因为an entity must have an identity so that a unique row can be identified in the database table。因此,尽管您拥有load_only(),但查询包含主键。如果您只需要数据,则应专门查询:

    session.query(table.col1, table.col2).all()
    

    结果是键控元组,在许多情况下,您可以像对待实体一样对待它们。

    实际上有一个issue where having load_only() did remove the primary key from the select list,它是fixed in 0.9.5

    [orm] [bug] 修改了orm.load_only() 的行为,使得主键列始终添加到“未延迟”列列表中;否则,ORM 无法加载行的标识。显然,可以推迟映射的主键,而 ORM 将失败,这并没有改变。但是由于 load_only 本质上是在说“除了 X 之外的所有东西都推迟”,所以更关键的是 PK 列不属于这种推迟的一部分。

    【讨论】:

    • 谢谢 - 但是当我这样做时,我只得到第一个 col(即table.col1) - 不是两个。我想我之前尝试过类似的东西。
    • 可能应该指出 - 最初尝试使用 load_onlyjoinedload。那时我意识到主键正在返回(看到两个正在连接的表的 id 被获取)。 ...问题是一种“最小示例”,显示 load_only 函数返回主键。
    • 相对于原始问题,您的问题可能过于简单,但它本身就是一个很好的问题。至于“当我这样做时,我只得到第一个 col”,你到底做了什么?
    猜你喜欢
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 2017-12-04
    • 2019-02-19
    • 2015-04-25
    • 2018-04-21
    • 1970-01-01
    相关资源
    最近更新 更多