rest_gaeでのユーザ削除とその関連データの削除
GAEでユーザ削除と、それに関連するデータ削除のケースを考える。
前提として、rest_gae+webapp2を使っている。
今回は「関連するデータ」を「投稿データ」とする。
ソースコードで表すと、下の例のように投稿データを表すUserPostクラスが、ownerとしてUserクラス(ユーザ)を持つ。
このUserPostは複数GAEのデータストア内に存在可能なので、結果として「ユーザ」と「投稿」の1対多の関係となる。
class UserPost(ndb.Model): owner = ndb.KeyProperty(kind='User') #投稿したUser description = ndb.StringProperty() #書き込み class RESTMeta: user_owner_property = 'owner'
【理想】
外部キーをカスケード設定して、ユーザ削除と同時に投稿データも自動削除されること
【現実】
上の理想は実現できない。。。RDBではないから。
【考えた対応策#1】
ユーザ削除後に呼ばれるコールバック関数を設定して、そのコールバック関数内で投稿データの削除を行う。そのためには、投稿データのparentをユーザにしておく必要がある。
<この対応策>:☓
<その理由>:他のモデルクラスの場合はコールバック関数が設定できるのに、Userモデルクラスに対してはコールバック関数が設定できなかった。
【考えた対応策#2】
利用者がユーザ削除ボタンを押した時(スマホアプリを想定)、アプリ側で
1,投稿データ削除
2,ユーザ削除
の順にAPI呼び出しを制御する。
<この対応策>:◯
<その理由>:ベストと言えないかもしれないが、他に解決策が見えなかったのでこれを採用する