Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Move Google datastore data to different project or to different account
# -*- coding: utf-8 -*-
"""
move_google_datastore
Move google datastore data to different project / different account.
:license: MIT
"""
from google.cloud import datastore
from google.cloud.datastore.entity import Entity
# Ref: https://googlecloudplatform.github.io/google-cloud-python/stable/datastore-client.html#google.cloud.datastore.client.Client
old_client = datastore.Client(
project='project-1',
namespace='namespace',
credentials=None # Use credentials accordingly
)
new_client = datastore.Client(
project='project-2'
namespace=None # None will move to default namespace
credentials=None # Use credentials accordingly
)
def move_kind(kind):
for old_entity in old_client.query(kind=kind).fetch():
key = new_client.key(kind, old_entity.key.name) # Create new key
print "creating..", key
new_entity = Entity(key, exclude_from_indexes=tuple(old_entity.exclude_from_indexes)) # New entity with same indexes
for k, v in old_entity.items():
if isinstance(v, datastore.key.Key):
if v.id:
# TODO: Test autogenerated ids can be moved ?
continue
else:
# continue with custom id(name) type
v = new_client.key(v.kind, v.name)
elif type(v) is list:
# XXX: If value contains list of keys, update all keys to new
# Keys under new project.
# Update this accordingly.
items = []
for ki in v:
if ki.id:
# TODO: Test autogenerated ids can be moved ?
continue
else:
# continue with custom id(name) type
items.append(new_client.key(ki.kind, ki.name))
v = items
new_entity[k] = v
new_client.put(new_entity)
for kind in ['Kind1', 'Kind2', 'Kind3']:
move_kind(kind)
@Piccirello

This comment has been minimized.

Copy link

@Piccirello Piccirello commented Mar 27, 2019

Thanks for sharing this solution. The google-cloud package has now been deprecated, so I created a JavaScript version of this script. You can find that here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment