我想动态创建两个表之间的 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)
Run Code Online (Sandbox Code Playgroud)
因此,我想在定义 Bar后将名为“foo”的关系添加到映射类“Bar” ,并且 SQLAlchemy 完成了定义映射器等工作。
2017-09-05 更新:为什么这对我来说是必要的?(我想我可以忽略这一点,因为我认为它主要分散了要解决的实际问题的注意力,但因为有关于它的评论......)
首先,我没有一个数据库,而是数百个/数千个。旧数据库中的数据不得以任何方式更改,但我希望使用单个源代码来访问旧数据(即使数据结构和计算规则发生显着变化)。
目前我们使用多个模型定义。后来的定义扩展/修改了以前的定义。我们经常动态地操作 SQLAlchemy 模型。我们尽量不在映射类中包含代码,因为我们认为多次更改表后确保代码的正确性会更加困难(代码必须在每个中间步骤中工作)。
在许多情况下,我们在模型 X-1 中最初定义表(映射类)后,会在模型 X 中以编程方式扩展表(映射类)。向现有 SQLAlchemy ORM 类添加列是可以管理的。现在,我们在现有表中添加一个新的参考列,并relationship()提供更好的 Python API。
好吧,我上面的问题再次是 SQLAlchemy 超能力的一个很好的例子(以及我有限的理解):
Bar.__mapper__.add_property('foo', relationship('Foo'))
Run Code Online (Sandbox Code Playgroud)
可能我最初无法使其正常工作,因为我周围的一些代码混合了添加关系和列。声明列还有一个重要的区别:
Column('foo', Integer)
Run Code Online (Sandbox Code Playgroud)
对于列,第一个参数可以是列名称,但不能将其用于关系。relationship('foo', 'Foo')将其传递给 时触发异常.add_property()。
| 归档时间: |
|
| 查看次数: |
2729 次 |
| 最近记录: |