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 オブジェクトが返されることに注意してください。したがって、 を呼び出すときは、(User オブジェクトではなく) Query オブジェクトdelete()を呼び出しています。delete()これは、一括削除を行っていることを意味します (ただし、おそらく 1 行だけが削除されます)。

使用しているメソッドのドキュメントに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)

それ以外の場合は、データベースのカスケードの設定も検討することをお勧めします。

于 2013-10-08T10:21:32.513 に答える