gpt4 book ai didi

python - SQLAlchemy:如何以编程方式创建关系

转载 作者:太空宇宙 更新时间:2023-11-04 04:59:43 24 4
gpt4 key购买 nike

我想在两个表之间动态创建 1:n 关系。我的数据库模型是通过 SQLAlchemy 映射的,但由于我的应用程序的某些特殊功能,我无法使用默认的声明方式。

例如

class Foo(Base):
id = Column(Integer, autoincrement=True, primary_key=True)
flag = Column(Boolean)

class Bar(Base):
id = Column(Integer, autoincrement=True, primary_key=True)
foo_id = Column(Integer, ForeignKey('foo.id'))
# declarative version:
# foo = relationship(Foo)

所以我想将名为“foo”的关系添加到映射类“Bar”之后定义了 Bar 并且 SQLAlchemy 完成了定义映射器等的工作。

2017-09-05 更新:为什么这对我来说是必要的? (我想我可以省略这个,因为我认为它主要分散了要解决的实际问题的注意力,但因为有关于它的评论......)

首先,我没有一个数据库,而是成百上千个。不得以任何方式更改旧数据库中的数据,但我希望使用单一源代码访问旧数据(即使数据结构和计算规则发生重大变化)。

目前我们使用多个模型定义。后来的定义扩展/修改了以前的定义。我们经常动态地操作 SQLAlchemy 模型。我们尽量不要在映射类中包含代码,因为我们认为在多次更改表后确保该代码的正确性会更加困难(代码必须在每个中间步骤中工作)。

在许多情况下,我们在模型 X 中最初定义表(映射类)后在模型 X-1 中对其进行编程扩展。向现有 SQLAlchemy ORM 类添加列是可管理的。现在我们在现有表中添加一个新的引用列,relationship() 提供了更好的 Python API。

最佳答案

好吧,我上面的问题又是一个很好的例子,说明了 SQLAlchemy 的超能力(以及我有限的理解):

 Bar.__mapper__.add_property('foo', relationship('Foo'))

可能一开始我无法让它工作,因为我周围的一些代码混合了添加关系和列。声明列也有一个重要区别:

Column('foo', Integer)

对于列,第一个参数可以是列名,但不能将其用于关系。 relationship('foo', 'Foo') 在将其传递给 .add_property() 时触发异常。

关于python - SQLAlchemy:如何以编程方式创建关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46056696/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com