2013-10-08 118 views
11

我的User模型與Address模型有關係。我已經指定關係應該級聯刪除操作。但是,當我查詢和刪除用戶時,出現地址行仍被引用的錯誤。如何刪除用戶和地址?SQLAlchemy刪除不級聯

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} 

回答

27

您有以下...

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

注意, 「過濾」 之後,你仍然返回的查詢對象。因此,當您撥打delete()時,您正在查詢對象(不是用戶對象)上調用delete()。這意味着你正在做一個批量刪除(儘管可能只是一個單一的排被刪除)

documentation for the Query.delete()方法所使用說...

的方法不提供在的Python的級聯關係 - 它是 假定ON DELETE CASCADE/SET NULL/etc。配置爲需要它的任何 外鍵引用,否則數據庫可能會 發出完整性違規,如果外鍵引用是 強制執行。

正如它所說的,以這種方式運行刪除操作將忽略您設置的Python級聯規則。你可能想要做類似的事情..

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

否則,你不妨看看setting up the cascade for your database as well

+0

非常感謝您的支持。對於第一種工作方法,我需要做些什麼改變? – AndroidDev

+0

@BadLuckBrian:這取決於你使用的數據庫。閱讀我在問題結尾處鏈接到的文檔以獲取更多信息。另外,請閱讀數據庫的文檔。 –

+0

我在Heroku上使用posgress。我在地址表中的Foregien Key列中添加了級聯選項。也許Flask-Migrate可能沒有注意到這個約束被添加了?那可能嗎? – AndroidDev