SQLalchemy“ load_only”不只加载指定的列

时间:2019-01-12 06:49:42

标签: python sqlalchemy

我正在尝试使用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"

考虑到我已经指定要使用的“ only”列,这不是我所期望的... id的来源-并可以删除它吗?

1 个答案:

答案 0 :(得分: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()的行为,以便始终将主键列添加到“ undeferred”列列表中;否则,ORM无法加载该行的身份。显然,可以推迟映射的主键,而ORM将会失败,并且没有更改。但是,正如load_only本质上说的是“除X外,其余所有都推迟”,因此更重要的是PK col不应成为此延迟的一部分。