Sqlalchemy在添加外键表时向查询中添加了不必要的列
在Sqlalchemy的查询中,你可以这样选择特定的行:
q = session.query(Equipment.name)
这样会返回每一行的一列数据。你还可以从模型中添加更多的列描述。在这个例子中,len(q.column_descriptions)
的值是1。
但是,一旦你添加了一个外键列,情况就变了,你会突然得到这个表的所有列,尽管我并没有请求这些列。
q = dbsession.query(models.Equipment.name, models.Equipment.model)
本来应该只有两列,但现在len(q.column_descriptions)
变成了15(对于这个表来说,这就是所有列加上额外的一列)。
查询(q.statement)最后看起来是这样的:
SELECT public.equipment.name, public.equipment.id, public.equipment.model_id, public.equipment.serno, public.equipment.location_id, public.equipment.sublocation, public.equipment.addeddate, public.equipment.comments, public.equipment.language_id, public.equipment.owner_id, public.equipment.vendor_id, public.equipment.account_id, public.equipment.parent_id, public.equipment.active
FROM public.equipment
我觉得这可能是Sqlalchemy的一个bug,但也许是我做错了什么,这里可能有人知道原因。
1 个回答
3
“name”是一个列,而“model”不是,它是一个关系(根据上面的观察行为)。目前,关系的默认__clause_element__()
是整个表,所以所有列都会被显示出来。正如你在票据#1328中提到的,这个问题是相关的,但那里的提议是你会得到('name', SomeModelObject),所以那里也没有外键列。在SQLAlchemy中,“外键”和“关系”的区别与其他ORM工具不同,后者可能会隐藏“外键”列的存在。
如果你只想查询外键列,你需要这样写:query(Equipment.name, Equipment.model_id),或者使用引用“model”的外键列的名称。如果你在使用Elixir,那么你可能需要查阅他们的文档,看看他们使用的名称是什么。