🍣

AppEngineNDB → Python Client for Google Cloud Datastore API 移行まとめ

2023/04/19に公開

初めに

直近でAppEngine + Pythonの2系から3系への移行を経験しました。その際以前の環境で使用されていたライブラリも移行する必要が出てきており、今回はその中でAppEngineNDBからPython Client for Google Cloud Datastore(以後 Datastore API)の移行について、知っておきたかったことなど簡単に取り上げたいと思います。


前提

AppEngine + Python2系 → 3系への移行作業は、2系でサポートされていたAppEngine系のライブラリが3系では対応外であることがあるため、言語のバージョンアップと共にそちらの移行も必要になります。今回はDatastore APIについて取り上げていますが、他にもmailやキャッシュなどのライブラリの移行もしました。


本題

IN演算子に使用できるのは10個まで

AppEngineNDBの時には、IN演算子に使用できるリストの数は制限がありませんでしたが、Datastore APIの場合だと使用できるのは10個までとなっています。

記法は以下の通りになっており、若干書き方も変わっています。

    • ndb公式

      query = Article.query(Article.tags.IN(['python', 'ruby', 'php']))
      
    • datastore 公式

      query = client.query(kind="Article")
      query.add_filter("tags", "IN", ["python", "ruby", "php"])
      

若干話は逸れますが、そもそもの移行先として、CloudNDBとDatastore APIの二つがあるみたいです

後々になって知って調べてみると、CloudNDBの方が移行しやすい印象を持ったので参考までに

appengine-python2-3-migration/datastore at main · GoogleCloudPlatform/appengine-python2-3-migration

Cloud NDB への移行  |  Google App Engine スタンダード環境のドキュメント  |  Google Cloud


トランザクション内で一度にデータ変更できるのは25件まで

複数のエンティティ(データ)を一度に更新、削除できるput_multidelete_multiというメソッドがありますが、トランザクション内で実行したところ25件までしか実行できませんでした。

公式にはエンティティグループ(同じ親となるエンティティを持つ子のグループ)が25個までとあるので、グループを使用すれば25件以上の変更が可能かと思います。ただ今回扱ったデータについては、親子の関係であるわけでもなかったため、単純ですが対応として25件ずつトランザクション内で更新(削除)の処理をするようにしました。

ids = (削除するIDの配列)
limit = 25
for i in range(0, len(ids), limit):
    delete_ids = ids[i:i+limit]
    with client.transaction():
        keys = [client.key("Kind", id) for id in delete_ids]
        client.delete_multi(keys)


参考

Discussion