gpt4 book ai didi

python - 在 Google App Engine (Python) 中将数据从产品数据存储传输到本地开发环境数据存储

转载 作者:太空宇宙 更新时间:2023-11-04 00:10:15 27 4
gpt4 key购买 nike

TL;DR 我需要找到一个真正的解决方案来从产品数据存储下载我的数据并将其加载到本地开发环境。

详细问题:

我需要使用产品服务器数据存储中的真实数据(非实时数据)在本地开发服务器中测试我的应用程序。文档和其他资源提供三个选项:

  1. 使用appfg.py从产品服务器下载数据,然后加载到本地开发环境。当我使用此方法时,由于 Oauth 问题,我收到“错误请求”错误。此外,此方法将被弃用。官方文档建议使用第二种方法:
  2. 使用gcloud via managed export and the import .此方法的史诗文档解释了我们如何备份控制台上的所有数据(在 https://console.cloud.google.com/ 中)。我试过这个方法。备份数据是在云存储中生成的。我下载了它。它采用 LevelDB 格式。我需要将它加载到本地开发服务器中。没有官方解释。第一种方式的加载方式不兼容LevelDB格式。我找不到解决问题的官方方法。有一个 StackOverflow entry但它对我不起作用,因为它只是将所有实体作为字典。 “dic”对象与“ndb”实体的对话成为棘手的问题。
  3. 我对前两种方法失去了希望,然后我决定使用 Cloud Datastore Emulator (beta)提供本地开发环境的仿真真实数据。它仍然是测试版并且有几个问题。无论如何,当我运行命令时,我遇到了 DATASTORE_EMULATOR_HOST 问题。

最佳答案

听起来你应该使用远程沙箱

即使您让它工作,本地主机数据存储的行为仍然与实际数据存储不同。

如果您想真正模拟您的生产环境,那么我建议将您的 App Engine 项目的克隆设置为远程沙箱。您可以将您的应用程序部署到新的 gae 项目 ID appcfg.py update 。 -A sandbox-id,并使用数据存储管理在谷歌云存储中创建生产备份,然后使用沙箱中的数据存储管理在沙箱中恢复此备份。

将生产数据克隆到本地主机

我确实用一些生产数据准备了我的本地主机数据存储,但这不是一个完整的克隆。仅需要核心对象和一些测试用户。

为此,我编写了一个谷歌数据流作业,用于导出选定模型并将它们以 jsonl 格式保存在谷歌云存储中。然后在我的本地主机上,我有一个名为 /init/ 的端点,它启动一个任务队列作业来下载这些导出并导入它们。

为此,我重用了我的 JSON REST 处理程序代码,它能够将任何模型转换为 json,反之亦然。

理论上,您可以对整个数据存储执行此操作。

编辑 - 这是我的 to-json/from-json 代码的样子:

我的所有 ndb.Model 都是我的 BaseModel 的子类,它具有通用转换代码:

get_dto_typemap = {
ndb.DateTimeProperty: dt_to_timestamp,
ndb.KeyProperty: key_to_dto,
ndb.StringProperty: str_to_dto,
ndb.EnumProperty: str,
}
set_from_dto_typemap = {
ndb.DateTimeProperty: timestamp_to_dt,
ndb.KeyProperty: dto_to_key,
ndb.FloatProperty: float_from_dto,
ndb.StringProperty: strip,
ndb.BlobProperty: str,
ndb.IntegerProperty: int,
}

class BaseModel(ndb.Model):

def to_dto(self):
dto = {'key': key_to_dto(self.key)}
for name, obj in self._properties.iteritems():
key = obj._name
value = getattr(self, obj._name)
if obj.__class__ in get_dto_typemap:
if obj._repeated:
value = [get_dto_typemap[obj.__class__](v) for v in value]
else:
value = get_dto_typemap[obj.__class__](value)
dto[key] = value
return dto

def set_from_dto(self, dto):
for name, obj in self._properties.iteritems():
if isinstance(obj, ndb.ComputedProperty):
continue
key = obj._name
if key in dto:
value = dto[key]
if not obj._repeated and obj.__class__ in set_from_dto_typemap:
try:
value = set_from_dto_typemap[obj.__class__](value)
except Exception as e:
raise Exception("Error setting "+self.__class__.__name__+"."+str(key)+" to '"+str(value) + "': " + e.message)
try:
setattr(self, obj._name, value)
except Exception as e:
print dir(obj)
raise Exception("Error setting "+self.__class__.__name__+"."+str(key)+" to '"+str(value)+"': "+e.message)

class User(BaseModel):
# user fields, etc

我的请求处理程序然后使用 set_from_dto & to_dto 像这样(BaseHandler 还提供了一些方便的方法来将 json 有效负载转换为 python 字典等等不是):

class RestHandler(BaseHandler):
MODEL = None

def put(self, resource_id=None):
if resource_id:
obj = ndb.Key(self.MODEL, urlsafe=resource_id).get()
if obj:
obj.set_from_dto(self.json_body)
obj.put()
return obj.to_dto()
else:
self.abort(422, "Unknown id")
else:
self.abort(405)

def post(self, resource_id=None):
if resource_id:
self.abort(405)
else:
obj = self.MODEL()
obj.set_from_dto(self.json_body)
obj.put()
return obj.to_dto()

def get(self, resource_id=None):
if resource_id:
obj = ndb.Key(self.MODEL, urlsafe=resource_id).get()
if obj:
return obj.to_dto()
else:
self.abort(422, "Unknown id")
else:
cursor_key = self.request.GET.pop('$cursor', None)
limit = max(min(200, self.request.GET.pop('$limit', 200)), 10)
qs = self.MODEL.query()
# ... other code that handles query params
results, next_cursor, more = qs.fetch_page(limit, start_cursor=cursor)
return {
'$cursor': next_cursor.urlsafe() if more else None,
'results': [result.to_dto() for result in results],
}

class UserHandler(RestHandler):
MODEL = User

关于python - 在 Google App Engine (Python) 中将数据从产品数据存储传输到本地开发环境数据存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52756120/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com