简短问题:从SQL Alchemy支持的对象获取时,如何避免对象创建?
情况: SQL Alchemy:我有一个ORM对象(声明性基础)由带有列uid,name等的表支持的对象。现在我想创建一个单独的表ObjectProps,它使用uid作为外键,主键,然后是一个额外的Text领域。另外,它被设置为一种关系,使得ObjectProps与ObjectProps有一个名为props的关系(uselist = False,backref =“object”)。
长问题:如何在不使用生成ObjectProps ORM对象的情况下通过props 检索ObjectProps的Text属性/列?理想情况下,我希望避免对象创建开销,因为理想情况下我只想检索列的值而不创建整个ObjectProps。
据推测,该解决方案需要将ORM层与SQL层混合。任何帮助表示赞赏。
答案 0 :(得分:1)
我将查询分为:对象的保护和查询SQL等数据。 试试看 http://docs.sqlalchemy.org/en/rel_0_9/core/tutorial.html#selecting http://docs.sqlalchemy.org/en/latest/core/selectable.html
http://docs.sqlalchemy.org/en/rel_0_9/orm/query.html 使用查询:
.session.query(
UserModel.id,
UserModel.username,
UserModel.email,
UserModel.best_friend_id,
FUserModel.username.label('friend_username'),
func.count().label('friends')
)\
.select_from(UserModel)\
...
答案 1 :(得分:1)
当您使用relationship()
时,ORM加载的所有内容都将成为一个对象。这取决于问题是否是加载ObjectProps的性能和内存开销,或者它是否只是想要以一种很好的方式访问列而没有"看到" ObjectProps。对于后者,使用关联代理很容易,我们有examples这个。对于前者,是的,如果你只想要一个原始的SELECT,你需要使用core。您也许可以使用descriptor。下面是第一次访问时从表中执行SELECT的那个:
class MyObject(Base):
# ...
_properties = None
@property
def my_properties(self):
if self._properties:
return self._properties
self._properties = dict(
(row.key, row.value) for row in
object_session(self).execute(
object_table.select().
where(object_table.c.parent_id == self.id)
)
)
return self._properties
上面还有一些基本的记忆。如果您想这样做,并将_properties
链接到对象的生命周期,则可以将其链接到expire之类的事件,以便您知道何时清除它。