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

Python SQLAlchemy:如何以编程方式创建关系,python,sqlalchemy,Python,Sqlalchemy,我想在两个表之间动态创建1:n关系。我的DB模型是通过SQLAlchemy映射的,但是由于我的应用程序的一些特殊特性,我不能使用默认的声明方式 例如 因此,我想在定义了Bar之后,将名为“foo”的关系添加到映射类“Bar”,SQLAlchemy完成了定义映射器等工作 更新2017-09-05:为什么这对我来说是必要的?(我想我可以省略这一点,因为我认为这主要会分散人们对实际问题的注意力,但因为有人对它发表评论…) 首先,我没有一个数据库,只有成百上千个。不能以任何方式更改旧数据库中的数据,但我

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

例如

因此,我想在定义了Bar之后,将名为“foo”的关系添加到映射类“Bar”,SQLAlchemy完成了定义映射器等工作

更新2017-09-05:为什么这对我来说是必要的?(我想我可以省略这一点,因为我认为这主要会分散人们对实际问题的注意力,但因为有人对它发表评论…)

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

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


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

好吧,我上面的问题再次是SQLAlchemy超能力的一个很好的例子(我的理解有限):

可能是因为我周围的一些代码混合了添加关系和列,所以一开始我无法实现这一点。声明列还有一个重要区别:

Column('foo', Integer)

对于列,第一个参数可以是列名,但不能将其用于关系<代码>关系('foo','foo')将其传递到
时触发异常。添加属性()

这背后的原因是什么?你想在创建多个关系时像使用外部模型列表一样使用吗?只需在类中添加一个关系属性,尽管@krassowski是对的:你为什么需要它?@ilja everilä:你能详细说明一下吗?我需要将关系定义与实际声明完全解耦。基本上,我想知道如何操作SQLAlchemy的内部代码,但在(非常好的)文档中找不到正确的部分,我希望有人能帮我节省几个小时阅读SQLAlchemy源代码…:-)如果我没弄错的话,这里有一个省时的方法:。所以,我所说的“只是添加”意味着,在定义了新的关系属性之后,您可以简单地将它们连接到映射类。
 Bar.__mapper__.add_property('foo', relationship('Foo'))
Column('foo', Integer)