5

I have about 4000 records that I need to upload to Datastore.

They are currently in CSV format. I'd appreciate if someone would point me to or explain how to upload data in bulk to GAE.

4

4 回答 4

6

您可以使用bulkloader.py工具:

Python SDK 附带的 bulkloader.py 工具可以将数据上传到应用程序的数据存储区。只需进行一点设置,您就可以从 CSV 文件创建新的数据存储实体。

于 2009-04-12T11:29:27.710 回答
3

我没有完美的解决方案,但我建议您使用App Engine Console。App Engine Console 是一个免费插件,可让您在生产环境中运行交互式 Python 解释器。由于以下几个原因,它有助于一次性数据操作(例如初始数据导入):

  1. 这是老式的 read-eval-print 解释器。您可以一次做一件事情,而不必一次编写完美的导入代码并批量运行它。
  2. 您可以交互式访问自己的数据模型,因此您可以从数据存储中读取/更新/删除对象。
  3. 您可以交互式访问 URL Fetch 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. put() 将其放入数据存储中

您应该会发现,在通过#5 的一次迭代之后,您可以复制和粘贴,或者编写简单的函数来加快您的导入任务。此外,通过在步骤 5.1 和 5.2 中获取和处理您的数据,您可以慢慢来,直到您确定自己拥有完美的数据。

注意,App Engine 控制台目前最适合 Firefox。

于 2009-05-03T10:48:15.793 回答
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 的更多信息,请查看此答案

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

  1. 打开 Test.csv 文件。
  2. 设置分隔符。我们使用分号。
  3. 然后,您有两个不同的选项来创建实体列表:
    1. 使用 map reduce 函数。
    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 请求中批处理适当数量的实体。

查看此文档以获取更多信息:

于 2013-02-02T19:44:03.863 回答
0

后期版本的app engine sdk,可以使用appcfg.py上传

appcfg.py

于 2009-07-04T06:21:12.710 回答