繁体   English   中英

SQLAlchemy可以在不查询数据库的情况下填充外键关系吗?

[英]Can SQLAlchemy populate foreign key relationships without querying the database?

我来自.NET世界,ORM NHibernate可以通过id加载对象来填充外键关系。 加载对象只返回具有我指定的标识符的该对象的代理。 当我知道标识符存在时,这对填充的关系很有用,因为它不需要查询数据库,从而节省了许多往返。

这是我的情景。 我有一个可以与一个或多个部门相关联的客户模型。 这些分区静态存储在数据库中,并且可以与一个或多个客户相关联,因此需要我建模多对多关系。 有一个REST API路由,形式为/api/v1/customers/123/divisions ,其中我以分区id列表的形式POST JSON数据, {'division_ids': [1, 2, 3, 4]} 在这种情况下(实际使用可能相当于20+分区ID,我将需要发出一个查询来获取客户(id 123)以及4个查询来获取分区。

既然我知道要插入的分区的id,我可以强制SQLAlchemy只使用id而不是获取对象吗?

SQLAlchemy可以做类似的事吗?

如果我正确理解你的问题,是的,你可以通过在关系中使用lazy="dynamic"来实现。 文档:

实现大型集合管理的关键特性是所谓的“动态”关系。 这是一种可选的relationship()形式,它在访问时返回一个Query对象来代替集合。 filter()标准可以显式应用,也可以通过数组切片应用限制和偏移:

示例表:

class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    children = relationship("Child", lazy="dynamic")

class Child(Base):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('parent.id'))

加载Parent对象时,不会加载子对象; 相反,将在其位置加载Query对象,如果需要,可以使用它来访问子对象。

p = session.query(Parent).first() # children will not be loaded here
print(type(p.children)) # <class 'sqlalchemy.orm.dynamic.AppenderQuery'>
all_children = p.children.all() # conduct a query on the children query object
print(all_children) # [<__main__.Child object at 0x10ba3f908>, <__main__.Child object at 0x10ba3f978>]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM