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

one*_*ree 5 python sqlalchemy

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

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

由于我知道要插入的分区的 id,我可以强制 SQLAlchemy 简单地使用 id 而不是获取对象吗?

SQLAlchemy 可以做类似的事情吗?

jum*_*pap 0

如果我正确理解你的问题,是的,你可以通过lazy="dynamic"在关系中使用来做到这一点。文件:

\n\n
\n

支持管理大型集合的一个关键功能是所谓的 \xe2\x80\x9cdynamic\xe2\x80\x9d 关系。这是关系()的一种可选形式,它在访问时返回一个查询对象来代替集合。可以显式地或通过数组切片应用filter()标准以及限制和偏移:

\n
\n\n

示例表:

\n\n
class Parent(Base):\n    __tablename__ = \'parent\'\n    id = Column(Integer, primary_key=True)\n    children = relationship("Child", lazy="dynamic")\n\nclass Child(Base):\n    __tablename__ = \'child\'\n    id = Column(Integer, primary_key=True)\n    parent_id = Column(Integer, ForeignKey(\'parent.id\'))\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

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