2014-08-28 60 views
0

简短问题:从SQL炼金术支持的对象中获取时,如何避免创建对象?我有一个ORM对象(声明性基础)对象支持一个表的列uid,名称等。现在我想创建一个单独的表ObjectProps,它使用uid作为外部的主要键,然后添加一个文本字段。此外,它被设置为一种关系,使得ObjectProps与ObjectProps有一种关系,称为props(uselist = False,backref =“object”)。使用SQL Alchemy避免创建对象

长问题:如何通过道具检索ObjectProps的文本属性/列没有生成ObjectProps ORM对象?理想情况下,我希望避免创建对象,因为理想情况下我只想检索列的值而不创建整个ObjectProps。

推测该解决方案需要将ORM层与SQL层混合。任何帮助赞赏。

回答

1

的一切,当你使用relationship()将是一个对象的ORM负荷。这取决于这个问题是否是加载ObjectProps的性能和内存开销,或者是否只是希望以非常好的方式访问列而不“看到”ObjectProps。对于后者,使用关联代理很容易,我们有这个examples。对于前者,是的,你需要使用核心,如果你只是想要一个原始的SELECT。你也许可以使用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之类的事件,以便您知道何时清除它。

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 使用quering:

.session.query(
     UserModel.id, 
     UserModel.username, 
     UserModel.email, 
     UserModel.best_friend_id, 
     FUserModel.username.label('friend_username'), 
     func.count().label('friends') 
    )\ 
     .select_from(UserModel)\ 

....

相关问题