google-app-engine - 在迁移到高复制数据存储后,在另一个增量副本之前可以安全地接触数据吗?

标签 google-app-engine google-cloud-datastore

为了迁移我们的应用程序(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/

相关文章:

java - GAE - 找不到类 : Caused by: java. lang.ClassNotFoundExceptionAppIdentityCredential$AppEngineCredentialWrapper

java - 找不到 :/<url-pattern>/的文件

google-app-engine - java.lang.IncompatibleClassChangeError : Implementing class deploying to app engine 错误

google-app-engine - Google App Engine Datastore 中的大量更新

java - Google Cloud Dataflow 写入数据(TextIO 或 DatastoreIO)时出现问题

python - 谷歌应用程序引擎polymodel - 重写实例方法 - 失败 - python

google-app-engine - 批量排队 Google Cloud 任务

java - 如何使用 JPA 更新带有 Google App Engine Java 的实体?

google-app-engine - Google App Engine - 本地开发服务器和部署服务器之间的区别

node.js - 事务中的 Google Datastore Transaction API 与 Datastore API