2013-10-08 12 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

あなたは、 "フィルタ" の後、あなたはまだQueryオブジェクトが返されていることを、次の...

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

注意を持っています。したがって、delete()を呼び出すと、Queryオブジェクト(Userオブジェクトではない)でdelete()が呼び出されています。これは、(おそらく削除されるだけで、単一の行とはいえ)削除バルクを行っている

を意味し、使用しているdocumentation for the Query.delete()方法は、その方法がで-のPythonのカスケード提供していません...

を語りますOFF DELETE CASCADE/SET NULL/etcのように仮定しているのは です。外部キー参照が が実施されている場合、 外部キー参照が必要な場合は データベースに完全性違反が発生する可能性があります。

このように、この方法でdeleteを実行すると、設定したPythonカスケード規則は無視されます。あなたはおそらくあなたがsetting up the cascade for your database as well見したい場合があり、そうでなければ

...のような
user = db.session.query(User).filter(User.my_id==1).first() 
db.session.delete(user) 

何かをしたかったです。

+0

ありがとうございます。最初の方法が機能するには、どのような変更が必要でしょうか? – AndroidDev

+0

@BadLuckBrian:これは使用しているデータベースによって異なります。私の質問の最後に私がリンクしているドキュメントを読んでください。また、データベースのドキュメントも参照してください。 –

+0

私はHerokuでポーズを使用しています。 AddressesテーブルのForegien Key列にカスケードオプションを追加しました。たぶんFlask-Migrateは、この制約が加えられたことに気付かなかったでしょうか?それは可能でしたか? – AndroidDev

関連する問題