与 parent class 的 sqlalchemy 外键关系
sqlalchemy foreignkey relation with parent class
我有以下数据库模式:
Parent table:
- id - 主键标识符。
- 类型 - polymorphic_identity.
- 名称 - 字符串数据列。
Child table - 继承 Parent:
- id - 主键标识符。
- parent_id - Parent.
的外键
- 类别 - 字符串数据列。
总而言之,我有两个 table。 Table Child 继承自 Parent 并且也有一个外键。
UPD: 我真的需要 inheritance 和 foreignkey。这个例子只是一个重现问题的简短演示。
我使用 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: Can't determine join between 'Parent' and 'Child'; tables have more than one foreign key constraint relationship between them. Please specify the 'onclause' of this join explicitly.
我尝试自己为 Parent 或 Child 分别设置关系属性,也为两者设置关系属性。尝试使用关系的 primaryjoin 和 foreign_keys 参数。但是错误还是一样。
我对这个错误一头雾水。
我需要帮助。
您是否尝试删除子 ID 字段的外键?
id = Column(Integer, ForeignKey('Parent.id'), primary_key=True)
parent_id = Column(ForeignKey("Parent.id"), nullable=True)
你需要这样的东西:
id = Column(Integer, auto_increment=True, primary_key=True)
parent_id = Column(ForeignKey("Parent.id"), nullable=True)
我找到了解决方案 here。
SQLAlchemy 在这种情况下需要提示:Child 的 __mapper_args__ 中的 inherit_condition 字段可以解决问题.
# -*- 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))
parent = relationship(Parent, foreign_keys=[parent_id])
__mapper_args__ = {
'polymorphic_identity':'Child',
'inherit_condition': id == Parent.id,
}
engine = create_engine('postgresql+psycopg2://joe:joe@localhost/alch')
session = sessionmaker()
session.configure(bind=engine)
Base.metadata.create_all(engine)
我有以下数据库模式:
Parent table:
- id - 主键标识符。
- 类型 - polymorphic_identity.
- 名称 - 字符串数据列。
Child table - 继承 Parent:
- id - 主键标识符。
- parent_id - Parent. 的外键
- 类别 - 字符串数据列。
总而言之,我有两个 table。 Table Child 继承自 Parent 并且也有一个外键。
UPD: 我真的需要 inheritance 和 foreignkey。这个例子只是一个重现问题的简短演示。
我使用 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: Can't determine join between 'Parent' and 'Child'; tables have more than one foreign key constraint relationship between them. Please specify the 'onclause' of this join explicitly.
我尝试自己为 Parent 或 Child 分别设置关系属性,也为两者设置关系属性。尝试使用关系的 primaryjoin 和 foreign_keys 参数。但是错误还是一样。
我对这个错误一头雾水。 我需要帮助。
您是否尝试删除子 ID 字段的外键?
id = Column(Integer, ForeignKey('Parent.id'), primary_key=True)
parent_id = Column(ForeignKey("Parent.id"), nullable=True)
你需要这样的东西:
id = Column(Integer, auto_increment=True, primary_key=True)
parent_id = Column(ForeignKey("Parent.id"), nullable=True)
我找到了解决方案 here。
SQLAlchemy 在这种情况下需要提示:Child 的 __mapper_args__ 中的 inherit_condition 字段可以解决问题.
# -*- 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))
parent = relationship(Parent, foreign_keys=[parent_id])
__mapper_args__ = {
'polymorphic_identity':'Child',
'inherit_condition': id == Parent.id,
}
engine = create_engine('postgresql+psycopg2://joe:joe@localhost/alch')
session = sessionmaker()
session.configure(bind=engine)
Base.metadata.create_all(engine)