我使用SQLAlchemy Joined Table Inheritance声明了两个clases。另外我使用 Flask-SQLAlchemy 和Flask。
class Parent(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255))
type = db.Column(db.String(50))
__mapper_args__ = {
'polymorphic_identity': 'parent',
'polymorphic_on': type
}
class Child(Parent):
id = db.Column(db.Integer, db.ForeignKey('parent.id'), primary_key=True)
brand_id = db.Column(db.Integer, nullable=False)
__mapper_args__ = {
'polymorphic_identity': 'child',
}
父表和子表之间的关系是一对一,在子端可选出现。
当我创建Child的新实例时,将其添加到会话并将其提交到数据库,一切都按预期工作。 SQLAlchemy将 INSERT
语句发送到父表,然后将另一个 INSERT
发送到子表,这些都是单独的,从而避免任何外键约束违规
在应用程序的某些方面,我想在子表中添加一个新行,引用父表中已存在的行。
当我创建一个新的 Child
实例并将其手动分配给FK列并将其发送到数据库时。我得到一个IntegrityError(重复唯一约束违规),因为SQLAlchemy尝试在数据库中创建一个新的父条目,并将id传递给子实例。
所以,真正的问题是:
如何告诉SQLAlchemy,父条目已存在于数据库中,我只想创建子条目?