我的User
模型与Address
模型有关系。我已经指定关系应该级联删除操作。但是,当我查询并删除用户时,我收到一个仍然引用地址行的错误。如何删除用户和地址?
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
addresses = db.relationship('Address', cascade='all,delete', backref='user')
class Address(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey(User.id))
db.session.query(User).filter(User.my_id==1).delete()
IntegrityError: (IntegrityError) update or delete on table "user" violates foreign key constraint "addresses_user_id_fkey" on table "address"
DETAIL: Key (my_id)=(1) is still referenced from table "address".
'DELETE FROM "user" WHERE "user".id = %(id_1)s' {'id_1': 1}
答案 0 :(得分:41)
你有以下......
db.session.query(User).filter(User.my_id==1).delete()
请注意,在“过滤器”之后,仍会返回一个Query对象。因此,当您调用delete()
时,您在Query对象(而不是User对象)上调用delete()
。这意味着您正在进行批量删除(尽管可能只删除了一行)
您正在使用的documentation for the Query.delete()
方法说...
该方法不提供Python内级联关系 - 它是 假设ON DELETE CASCADE / SET NULL / etc.是为任何配置 需要它的外键引用,否则数据库可能 如果存在外键引用,则发出完整性违规 执行。
正如它所说,以这种方式运行delete将忽略您设置的Python级联规则。你可能想做点什么......
user = db.session.query(User).filter(User.my_id==1).first()
db.session.delete(user)