【问题标题】:Avoiding object creation with SQL Alchemy避免使用 SQL Alchemy 创建对象
【发布时间】:2014-08-28 14:30:02
【问题描述】:

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

【问题讨论】:

    标签: sqlalchemy


    【解决方案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 之类的事件,以便您知道何时将其清除。

    【讨论】:

      【解决方案2】:

      我将查询分为:对象查询和数据查询,就像 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)\
      

      ....

      【讨论】:

        猜你喜欢
        • 2016-08-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-31
        • 2017-12-30
        • 2019-04-27
        • 2016-11-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多