gpt4 book ai didi

python - 在sqlalchemy中,当子表有多个父表的外键时,如何使用多态连接表继承?

转载 作者:太空狗 更新时间:2023-10-29 18:29:04 25 4
gpt4 key购买 nike

我有一个名为 pbx_point 的父表,它有一个 point_type 列。我还有一个名为 pbx_route 的子表,其中有一列名为 point_id 指向 pbx_point

我想使用 sqlalchemy 的连接表继承通过声明性基础将这两个表关联起来,并使用多态继承

这工作正常 - 或者更确切地说,如果没有以下附加约束,它会工作:pbx_point 也有一个名为 initial_route_id 的外键指向 pbx_route.

我也在下面使用反射,但数据库与我上面描述的一样。我得到的错误是 sqlalchemy.exc.AmbiguousForeignKeysError: Can't determine join between 'pbx_point' and 'pbx_route';表之间有多个外键约束关系。请明确指定此连接的“onclause”。

这是有道理的,因为“幕后”声明基础正在两个映射类上创建一个 relationship() 属性。我希望它选择 pbx_route.point_id 作为 parent_id 链接,但它也会看到 pbx_point.initial_route_id 列。如果我正在创建此 relationship(),这将很容易修复,但我不是 - 声明式继承系统是。

有没有我可以传递给 __mapper_args__ 的附加参数,例如 polymorphic_parent_col 可以让我指定我想要的外键?如果没有,我该如何解决这个问题?

谢谢。

class MyBase(DeferredReflection):
@declared_attr
def __tablename__(cls):
return cls.__name__.lower()

Base = declarative_base(cls=MyBase)

class pbx_point(Base):
__mapper_args__ = dict(
polymorphic_on='point_type',
with_polymorphic='*',
)

class pbx_route(pbx_point):
__mapper_args__ = dict(polymorphic_identity='pbx.route')

这是我得到的堆栈跟踪:

Traceback (most recent call last):
File "db.py", line 50, in <module>
Base.prepare(engine)
File "env/local/lib/python2.7/site-packages/sqlalchemy/ext/declarative/api.py", line 431, in prepare
thingy.map()
File "env/local/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.py", line 379, in map
**mapper_args
File "env/local/lib/python2.7/site-packages/sqlalchemy/orm/__init__.py", line 1147, in mapper
return Mapper(class_, local_table, *args, **params)
File "env/local/lib/python2.7/site-packages/sqlalchemy/orm/mapper.py", line 213, in __init__
self._configure_inheritance()
File "env/local/lib/python2.7/site-packages/sqlalchemy/orm/mapper.py", line 517, in _configure_inheritance
self.local_table)
File "env/local/lib/python2.7/site-packages/sqlalchemy/sql/util.py", line 397, in join_condition
"join explicitly." % (a.description, b.description))
sqlalchemy.exc.AmbiguousForeignKeysError: Can't determine join between 'pbx_point' and 'pbx_route'; tables have more than one foreign key constraint relationship between them. Please specify the 'onclause' of this join explicitly.

这表明它正在死于 line 1032 in mapper.py *。上面的几行引用了映射器 kwarg inherit_condition ,这似乎是我需要的。

[*]:源链接调整为1.3.11版本(之前的URL现在是404s)

最佳答案

关键是 inherit_condition映射器的参数。多态信息实际上与这一步没有任何关系。

修正模型:

class MyBase(DeferredReflection):
@declared_attr
def __tablename__(cls):
return cls.__name__.lower()

Base = declarative_base(cls=MyBase)

class pbx_point(Base):
__mapper_args__ = dict(
polymorphic_on='point_type',
with_polymorphic='*',
)
id = Column(Integer, primary_key=True)

class pbx_route(pbx_point):
point_id = Column(Integer, ForeignKey(pbx_point.id))
__mapper_args__ = dict(
polymorphic_identity='pbx.route',
inherit_condition=(point_id == pbx_point.id)
)

我需要添加 idpoint_id 列以在 inherit_condition 参数中使用它们。可能有一种方法可以只使用反射来做到这一点,但这并不是一个可怕的障碍。

关于python - 在sqlalchemy中,当子表有多个父表的外键时,如何使用多态连接表继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14885042/

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