私たちの GAE アプリは、NDB に別の Web サイトのリレーショナル データベースのローカル コピーを作成します。ユーザー、テーブル、行、フィールドの 4 つのエンティティ タイプがあります。各ユーザーには多数のテーブルがあり、各テーブルには多数の行があり、各行には多数のフィールドがあります。
SomeUser > SomeTable > ARow > AField
したがって、各ユーザーは 1 つのエンティティ グループになります。特定のユーザーのすべてのテーブル (およびその行) を消去できる機能が必要です。~5 操作/秒の競合制限を回避しながら、すべてのテーブルとすべての行を削除する正しい方法は何ですか。
TransactionFailedError
エンティティ グループで競合が発生したため、現在のコードは s を取得しています。(私が見落としていた詳細は、特定の値に設定された属性「サービス」を持つテーブルのみを削除したいということです)
def delete_tables_for_service(user, service):
tables = Tables.query(Tables.service == service, ancestor=user.key).fetch(keys_only=True)
for table in tables:
keys = []
keys += Fields.query(ancestor=table).fetch(keys_only=True)
keys += TableRows.query(ancestor=table).fetch(keys_only=True)
keys.append(table)
ndb.delete_multi(keys)