使用SQL Alchemy避免对象创建

时间:2014-08-28 14:30:03

标签: sqlalchemy

简短问题:从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层混合。任何帮助表示赞赏。

2 个答案:

答案 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之类的事件,以便您知道何时清除它。