SQLAlchemy delete不会级联

And*_*Dev 25 python sqlalchemy flask flask-sqlalchemy

我的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))
Run Code Online (Sandbox Code Playgroud)
db.session.query(User).filter(User.my_id==1).delete()
Run Code Online (Sandbox Code Playgroud)
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}
Run Code Online (Sandbox Code Playgroud)

Mar*_*eth 50

你有以下......

db.session.query(User).filter(User.my_id==1).delete()
Run Code Online (Sandbox Code Playgroud)

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

您正在使用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)
Run Code Online (Sandbox Code Playgroud)

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