如何批量上传数据到Google App Engine Datastore?

5

我有大约4000条记录需要上传到Datastore。

它们目前以CSV格式存在。如果有人能指点或解释如何批量上传数据到GAE,我将不胜感激。

4个回答

6
你可以使用bulkloader.py工具:bulkloader.py是Python SDK中包含的工具,可上传数据到应用程序的数据存储区。只需进行一些设置,即可通过CSV文件创建新的数据存储实体。

通过一些额外的工作,你甚至可以直接从SQL数据库或任何其他数据源加载数据。 - Nick Johnson

3
我没有完美的解决方案,但建议您尝试使用App Engine Console。 App Engine控制台是一个免费插件,可让您在生产环境中运行交互式Python解释器。 对于一次性数据操作(例如初始数据导入),它有几个有用之处:
  1. 这是一个传统的读取-评估-打印解释器。 您可以逐个执行操作,而不必一次编写完美的导入代码并进行批处理。
  2. 您可以交互式访问自己的数据模型,因此可以从数据存储中读取/更新/删除对象。
  3. 您可以交互式访问URL获取API,因此可以逐个拉取数据。
我建议您尝试以下内容:
  1. 在您的开发环境中使数据模型正常工作
  2. 将CSV记录拆分为小于1,000的块。将它们发布到Amazon S3或任何其他URL上。
  3. 在您的项目中安装App Engine控制台并将其推送到生产环境中
  4. 登录控制台。(只有管理员才能使用控制台,因此您应该是安全的。您甚至可以将其配置为向未经授权的用户返回HTTP 404以“伪装”)
  5. 对于每个CSV块:
    1. 使用URLFetch拉取一块数据
    2. 使用内置的csv模块分割数据,直到您获得一个有用的数据结构列表(最有可能是一个列表或类似的列表)
    3. 编写一个for循环,迭代列表中的每个数据结构:
      1. 创建具有所有正确属性的数据对象
      2. 将其放入数据存储库
你应该在第五步迭代一次后发现,你可以复制粘贴,或者编写简单的函数来加速导入任务。此外,在5.1和5.2中获取和处理数据时,你可以慢慢来,直到确定完美为止。
(注意,App Engine控制台目前最适合使用Firefox。)

不要使用App Engine控制台,最好使用remote_api_shell.py脚本。有关更多信息,请参见此处:https://developers.google.com/appengine/docs/python/tools/remoteapi#Running_Remote_Shell - Jernej Jerin

2
通过使用远程 API 和对多个实体进行操作,我将展示一个使用 Python 的 NDB 示例,其中我们的 Test.csv 包含以下用分号分隔的值:
1;2;3;4
5;6;7;8

首先我们需要导入模块:
import csv
from TestData import TestData
from google.appengine.ext import ndb
from google.appengine.ext.remote_api import remote_api_stub

然后我们需要创建远程API存根:
remote_api_stub.ConfigureRemoteApi(None, '/_ah/remote_api', auth_func, 'your-app-id.appspot.com')

关于使用远程API的更多信息,请查看this answer

然后是主要代码,基本上做了以下几件事:

  1. 打开Test.csv文件。
  2. 设置分隔符。我们使用分号。
  3. 然后您有两种不同的选项来创建实体列表:
    1. 使用MapReduce函数。
    2. 使用列表推导。
  4. 最后,您批量放置整个实体列表。

主要代码:

# Open csv file for reading.
with open('Test.csv', 'rb') as file:
    # Set delimiter.
    reader = csv.reader(file, delimiter=';')

    # Reduce 2D list into 1D list and then map every element into entity.
    test_data_list = map(lambda number: TestData(number=int(number)),
            reduce(lambda list, row: list+row, reader)
        )

    # Or you can use list comprehension.
    test_data_list = [TestData(number=int(number)) for row in reader for number in row]

    # Batch put whole list into HRD.
    ndb.put_multi(test_data_list)
put_multi操作还会确保在单个HTTP POST请求中批处理适当数量的实体。
请查看此文档以获取更多信息:

0

在较新版本的应用引擎 SDK 中,可以使用 appcfg.py 进行上传操作。

请参见appcfg.py


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接