我正在尝试使用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
的来源-并可以删除它吗?
答案 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不应成为此延迟的一部分。