如何获取具有结果的特定列作为表类对象的数组?

时间:2010-08-14 22:17:17

标签: sqlalchemy

我有一个简单的问题。在我的表中有列ID,NAME,CONTENT,TIMESTAMP。如果我使用session.query(table).all()result是表类对象的数组。所以我修改一个或多个对象并更新没有问题,或者在关联中使用这个对象。但我只需要列ID和NAME。如果使用session.query(table.id,table.name),我得到带有id和name的结果元组。使用这个元组更新它 - 也许 - 很容易,但代码它是......丑陋的。在协会中也一样。如果我只想要ID进行关联,那就是不必要的数据库加载。

到目前为止,我使用简单的代码来获取仅查询指定列的表类对象数组:
for row in session.query(table.id, table.name).all():
data.append(table(id=row.id, name=row.name))

它使更新变得容易,但在关联中使用很复杂。例如,我的代码中的表对象数组中有10行。我希望关联1行到table2 如果我使用: session.add(table2(name = 'test', association = data[1]))并承诺,
sqlalchemy想要创建新的table2行,新的关联表行和新的表行(第一行,与table2相关联)。

有没有办法将结果作为表对象的数组,而不是元组,使用指定的列,如果make query(table),返回的对象是否相同?

对不起我的英语,我从来没用它来描述复杂的问题,直到现在。

1 个答案:

答案 0 :(得分:0)

如果要减少使用.query(Table)从db加载的列数,从而减少开销,您可能希望在定义关系时尝试推迟不需要的列。说idname对您的更新至关重要,info不是,您可以告诉映射器推迟info

mapper(Class, table, properties={
  "info":column_property(table.c.info, deferred=True),
  ... other properties ....
}) 

因此,当您执行session.query(Class)时,将不会选择信息。只有在您拥有obj.info的代码中的某个地方,即显式调用此属性时,才会调用它。