Google App Engine で NDB を使用して、名前空間全体を完全に削除するにはどうすればよいですか?
次のコードは、すべてのエンティティを削除します。
def delete(namespace):
namespace_manager.set_namespace(namespace)
for kind in ndb.metadata.get_kinds():
keys = [ k for k in ndb.Query(kind=kind).iter(keys_only=True) ]
ndb.delete_multi( keys )
ただし、開発サーバーでは、呼び出し時に名前空間がまだ存在します。
ndb.metadata.get_namespaces()
また、実稼働環境では、システムの種類を削除しようとすると、次のような例外が発生します。
illegal key.path.element.type: __Stat_Ns_Kind__
名前空間を完全に消去するにはどうすればよいですか?
@jeremydw が指摘したように、名前空間情報は__namespace__
種類に格納されます。ただし、これは通常の動作とは異なり、特にエンティティの削除には何の効果もないようです。
id_namepace = 'some_test'
print list( ndb.Query(kind='__namespace__') )
# id_namespace is not present
# SomeModel is some existing model
key_entity = ndb.Key('SomeModel', 'some_string_id', namespace=id_namepace)
entity = datastore.CustomerAction(key=key_entity)
entity.put()
print list( ndb.Query(kind='__namespace__') )
# id_namespace is present (expected, namespace was implicitly created by adding one entity in it)
key_entity.delete()
print list( ndb.Query(kind='__namespace__') )
# id_namespace is present (expected, namespace still exists but contains no entities)
key_namespace = ndb.metadata.Namespace.key_for_namespace(id_namepace)
key_namespace.delete()
print list( ndb.Query(kind='__namespace__') )
# id_namespace is still present (not expected, kind='__namespace__' does not behave as a normal kind)