如何批量上传数据到Google App Engine数据存储区?

时间:2009-04-12 10:56:22

标签: google-app-engine upload bulk google-cloud-datastore

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

它们目前是CSV格式。如果有人愿意,我会很感激 请指出或解释如何将数据批量上传到GAE。

4 个答案:

答案 0 :(得分:6)

您可以使用bulkloader.py工具:

  

随附的bulkloader.py工具   Python SDK可以将数据上传到您的   应用程序的数据存储区。只有一个   一点点的设置,你可以创建   CSV文件中的新数据存储实体。

答案 1 :(得分:3)

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

  1. 这是一个很好的旧的read-eval-print解释器。您可以一次执行一项操作,而无需一次编写完美的导入代码并批量运行。
  2. 您可以对自己的数据模型进行交互式访问,因此您可以从数据存储中读取/更新/删除对象。
  3. 您可以对URL Fetch API进行交互式访问,因此您可以逐个提取数据。
  4. 我建议如下:

    1. 让您的数据模型在您的开发环境中运行
    2. 将您的CSV记录拆分为1,000以下的块。将它们发布到Amazon S3或任何其他URL的某个位置。
    3. 在项目中安装App Engine控制台并将其推送到生产
    4. 登录控制台。 (只有管理员可以使用控制台,因此您应该是安全的。您甚至可以将其配置为将HTTP 404返回给未经授权的用户“隐藏”。)
    5. 对于CSV的每个块:
      1. 使用URLFetch下拉一大块数据
      2. 使用内置的csv模块来截断您的数据,直到您有一个有用的数据结构列表(很可能是列表或类似的列表)
      3. 编写一个for循环,遍历列表中的每个数据结构:
        1. 创建具有所有正确属性的数据对象
        2. 将()放入数据存储
    6. 您应该会发现经过#5的一次迭代后,您可以复制和粘贴,或者编写简单的函数来加速导入任务。此外,通过在步骤5.1和5.2中获取和处理数据,您可以花时间直到确定自己完美无缺。

      注意,App Engine Console目前最适合Firefox。

答案 2 :(得分: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. 使用地图缩减功能。
    2. 使用列表理解。
  4. 最后,您批量放置整个实体列表。
  5. 主要代码:

    # 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请求中批处理适当数量的实体。

    有关详细信息,请查看此文档:

答案 3 :(得分:0)

app引擎sdk的更高版本,可以使用appcfg.py

上传

请参阅appcfg.py