Sqlalchemy 使用SQL炼金术避免对象创建
简短问题:从SQL Alchemy支持的对象获取时,如何避免创建对象 情况: SQL Alchemy:我有一个ORM对象(声明性基)对象,它由一个包含uid、name等列的表支持。现在我想创建一个单独的表ObjectProps,它使用uid作为外键、主键,然后是一个额外的文本字段。此外,它被设置为一种关系,使得ObjectProps与ObjectProps之间有一种称为props的关系(uselist=False,backref=“object”) 长问题:在不生成ObjectProps ORM对象的情况下,如何通过props检索ObjectProps的文本属性/列?理想情况下,我希望避免对象创建开销,因为理想情况下,我只想检索列的值,而不创建整个ObjectPropsSqlalchemy 使用SQL炼金术避免对象创建,sqlalchemy,Sqlalchemy,简短问题:从SQL Alchemy支持的对象获取时,如何避免创建对象 情况: SQL Alchemy:我有一个ORM对象(声明性基)对象,它由一个包含uid、name等列的表支持。现在我想创建一个单独的表ObjectProps,它使用uid作为外键、主键,然后是一个额外的文本字段。此外,它被设置为一种关系,使得ObjectProps与ObjectProps之间有一种称为props的关系(uselist=False,backref=“object”) 长问题:在不生成ObjectProps ORM
这个解决方案可能需要混合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属性
链接到对象的生命周期,您可以将其链接到类似的事件,以便知道何时清除它