Sqlalchemy 使用SQL炼金术避免对象创建

Sqlalchemy 使用SQL炼金术避免对象创建,sqlalchemy,Sqlalchemy,简短问题:从SQL Alchemy支持的对象获取时,如何避免创建对象 情况: SQL Alchemy:我有一个ORM对象(声明性基)对象,它由一个包含uid、name等列的表支持。现在我想创建一个单独的表ObjectProps,它使用uid作为外键、主键,然后是一个额外的文本字段。此外,它被设置为一种关系,使得ObjectProps与ObjectProps之间有一种称为props的关系(uselist=False,backref=“object”) 长问题:在不生成ObjectProps ORM

简短问题:从SQL Alchemy支持的对象获取时,如何避免创建对象

情况: SQL Alchemy:我有一个ORM对象(声明性基)对象,它由一个包含uid、name等列的表支持。现在我想创建一个单独的表ObjectProps,它使用uid作为外键、主键,然后是一个额外的文本字段。此外,它被设置为一种关系,使得ObjectProps与ObjectProps之间有一种称为props的关系(uselist=False,backref=“object”)

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


这个解决方案可能需要混合ORM层和SQL层。感谢您的帮助。

我将查询分为:对象查询和数据查询,就像SQL一样。 试看

使用查询:

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

..

当您使用
relationship()
时,ORM加载的所有内容都将是一个对象。这取决于问题是加载ObjectProps的性能和内存开销,还是只是希望以一种良好的方式访问列而不“看到”ObjectProps。对于后者,使用关联代理是很容易的,并且我们已经了解了这一点。对于前者,是的,如果只需要原始选择,则需要使用core。你也许可以用一个。下面是第一次访问时从表中进行选择的一个:

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
上面有一些基本的回忆录。如果您想这样做,并将
\u属性
链接到对象的生命周期,您可以将其链接到类似的事件,以便知道何时清除它