为了迁移我们的应用程序(2 年历史,大量数据),我计划使用 recommended tool .
我们的一些实体存储带有对键的引用的序列化字典,因此我们需要转换它们以更改键的应用程序名称部分。我的问题是,更改已迁移的数据是否会扰乱迁移工具对增量复制期间需要迁移的内容的理解?例如,以下操作是否安全:
- 启动迁移工具
- 运行我们的自定义工具来迁移存储的 key (在新应用中)
- 验证我们的应用是否正常运行
- 运行增量副本
- 再次运行我们的工具
最佳答案
事实证明,在迁移过程中,目标应用程序处于只读模式,因此在迁移完成之前无法在目标 HRD 应用程序上运行任何修复工具。
相反,我现在的方法是猴子修补 db.get 以动态重写 key ,然后在迁移后修复目标应用程序中的引用。到目前为止,我已经验证我的新 HRD 应用程序在猴子补丁到位的情况下可以正常工作。一旦新版本上线,我就必须修复引用,这让我很谨慎,但事情就是这样。
from google.appengine.ext import db
import os
APP_ID = os.getenv('APPLICATION_ID')
def replace_key(key_str, app_id=None):
app_id = app_id or APP_ID
oldkey = db.Key(key_str) if not isinstance(key_str, db.Key) else key_str
if oldkey.app() != app_id:
fixedkey = str(db.Key.from_path(oldkey.kind(), oldkey.id_or_name(), _app=app_id))
logging.info("rewriting %s to %s", str(oldkey), fixedkey)
return fixedkey
else:
return key_str
old_get = db.get
def monkeyed_get(keys, **kwargs):
single = False
if isinstance(keys, (basestring, db.Model, db.Key)):
single = True
keys = [keys]
results = old_get(map(lambda k: replace_key(str(k)), keys), **kwargs)
return results[0] if single else results
db.get = monkeyed_get
关于google-app-engine - 在迁移到高复制数据存储后,在另一个增量副本之前可以安全地接触数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9691927/