文章内容
2019/5/19 18:17:54,作 者: 黄兵
Set single_parent=True on the relationship().
今天在使用SQLAlchemy查询多对多的时候,出现了如下错误:
sqlalchemy.exc.ArgumentError: On PrivateNumberProperty.PrivateNumberTag, delete-orphan cascade is not supported on a many-to-many or many-to-one relationship when single_parent is not set. Set single_parent=True on the relationship().
出现这个问题的原因:
出现级联删除的时候,delete-orphan cascade意味着每个子对象一次只能有一个父对象,所以在绝大多数情况下配置为一对多关系。将它设置为多对一或多对多关系更加尴尬; 对于此用例,SQLAlchemy要求使用single_parent = True函数配置relationship(),该函数建立Python端验证,以确保对象一次只与一个父对象关联。
下面是源代码:
class PrivateNumberProperty(db.Model):
__tablename__ = 'private_number_property'
id = db.Column(db.Integer, primary_key=True)
property_name_id = db.Column(db.Integer, db.ForeignKey('property_name.id'))
subtitle = db.Column(db.String(64))
icon = db.Column(db.String(128))
private_number_catalog_id = db.Column(db.Integer, db.ForeignKey('private_number_catalog.id'))
PrivateNumberPrice = db.relationship('PrivateNumberPrice', backref='private_number_property', lazy='joined')
PrivateNumberTag = db.relationship('PrivateNumberTag', secondary=tp,
backref=db.backref('PrivateNumberProperty', lazy='dynamic'), lazy='dynamic',
cascade='all, delete-orphan')修改之后:
class PrivateNumberProperty(db.Model):
__tablename__ = 'private_number_property'
id = db.Column(db.Integer, primary_key=True)
property_name_id = db.Column(db.Integer, db.ForeignKey('property_name.id'))
subtitle = db.Column(db.String(64))
icon = db.Column(db.String(128))
private_number_catalog_id = db.Column(db.Integer, db.ForeignKey('private_number_catalog.id'))
PrivateNumberPrice = db.relationship('PrivateNumberPrice', backref='private_number_property', lazy='joined')
PrivateNumberTag = db.relationship('PrivateNumberTag', secondary=tp,
backref=db.backref('PrivateNumberProperty', lazy='dynamic'), lazy='dynamic',
single_parent=True,
cascade='all, delete-orphan')参考资料:
评论列表