36

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}
4

1 回答 1

87

你有以下...

db.session.query(User).filter(User.my_id==1).delete()

请注意,在“过滤”之后,您仍然会返回一个 Query 对象。因此,当您调用 时delete(),您调用delete()的是 Query 对象(而不是 User 对象)。这意味着您正在执行批量删除(尽管可能只删除了一行)

您正在使用的方法的文档Query.delete()说...

该方法不提供 Python 内的关系级联 - 假设 ON DELETE CASCADE/SET NULL/等。为需要它的任何外键引用配置,否则如果正在强制执行外键引用,数据库可能会发出完整性违规。

正如它所说,以这种方式运行 delete 将忽略您设置的 Python 级联规则。你可能想做类似的事情..

user = db.session.query(User).filter(User.my_id==1).first()
db.session.delete(user)

否则,您可能还希望查看为您的数据库设置级联

于 2013-10-08T10:21:32.513 回答