【发布时间】:2018-03-03 00:25:29
【问题描述】:
我有以下数据库架构:
父表:
- id - 主键标识符。
- 类型 - 多态身份。
- 名称 - 字符串数据列。
子表 - 继承父表:
- id - 主键标识符。
- parent_id - Parent 的外键。
- 类别 - 字符串数据列。
总结一下,我有两张桌子。表 Child 继承自 Parent 并且也有一个外键。
UPD:我真的需要继承和外键。此示例只是重现问题的简短演示。
我使用 declarative_base 来声明架构:
# -*- coding: utf-8 -*-
from sqlalchemy import Column, String, Integer, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class Parent(Base):
__tablename__ = "Parent"
id = Column(Integer, primary_key=True)
type = Column(String(250))
name = Column(String(250))
__mapper_args__ = {
'polymorphic_identity':'Parent',
'polymorphic_on':type
}
class Child(Parent):
__tablename__ = 'Child'
id = Column(Integer, ForeignKey('Parent.id'), primary_key=True)
parent_id = Column(ForeignKey("Parent.id"), nullable=True)
category = Column(String(250))
__mapper_args__ = {
'polymorphic_identity':'Child',
}
engine = create_engine('postgresql+psycopg2://joe:joe@localhost/alch')
session = sessionmaker()
session.configure(bind=engine)
Base.metadata.create_all(engine)
但是当我运行代码时出现以下错误:
sqlalchemy.exc.AmbiguousForeignKeysError:无法确定“父”和“子”之间的连接;表之间存在多个外键约束关系。请明确指定此连接的“onclause”。
我尝试自己为 Parent 或 Child 分别设置关系属性,也为两者设置关系属性。尝试使用关系的primaryjoin 和foreign_keys 参数。但是错误是一样的。
我完全对这个错误感到困惑。 我需要帮助。
【问题讨论】:
-
您不需要从
Parent继承,因为您确定您的fk 与Parent并没有其他相关。将class Child(Parent):更改为class Child(Base): -
@ShawnMehan 我真的需要继承。这是一个演示数据库模式,用于重现错误。我的真实架构有 1000 多个具有复杂继承的类。
-
你能创建一个父子都继承的基类吗?
标签: python database sqlalchemy foreign-keys hierarchy