GAE的批量上传下载数据

标签:Python, Google App Engine

终于到了最后一篇Google App Engine的Python文档翻译了。
之前没翻译是因为这个工具尚未完善,不过现在看上去不会有较大改动了。

先给英文文档地址,然后开始介绍。

一般的数据库都是可以直接导入导出数据的,例如MySQL就提供sql文件格式的数据导入导出。然而实际上这个文件包含的都是SQL语句,在执行导入操作时,数据库只是执行文件中的所有SQL语句而已。
我想GAE所用的BigTable应该也是有这种机制的,只不过我们这种用户是不可能有权限执行这种操作的,所以只能用程序导入。
虽说是导入,但实际上也是构造模型,创建实体,再执行put操作。一切仍和普通的request一样,只不过GAE提供了一个工具,自动帮我们完成数据转换和断点续传,而无需自己去处理而已。

了解原理后,就开始动工吧。

更新:目前该方法已不被推荐,新方法请参见《用新版Bulk Loader往GAE datastore上传XML数据》

首先要确定你的Python是否编译了sqlite3模块。至少在官网下载的windows版应该都编译了,自己编译的就不知道了,方法是import sqlite3,如果没出错就表示有。
如果没有的话,需要加上db_filename=skip参数,这会导致不支持断点续传,也就是一旦失败,需要从头来过。

接着设置一个remote_api地址,方法见《用remote_api来远程访问GAE的数据库》

之后创建一个载入类,分为2步:
  1. 定义模型
  2. 定义载入类
不想浪费时间,例子就看官方文档吧,这里只简要介绍。
导入文件是个csv文件,你可以将excel保存为csv文件。这个csv文件每列都是模型的一个字段。你需要在载入类中定义字段的处理方式。
如果是字符串,直接用str函数即可;如果是整数,用int函数即可;如果是自定义类型,如时间,你就需要一个自定义的函数来处理了。
所以应该不难弄懂这段代码:
import datetime
from google.appengine.ext import db
from google.appengine.tools import bulkloader
import models

class AlbumLoader(bulkloader.Loader):
  def __init__(self):
    bulkloader.Loader.__init__(self, 'Album',
                               [('title', str),
                                ('artist', str),
                                ('publication_date',
                                 lambda x: datetime.datetime.strptime(x, '%m/%d/%Y').date()),
                                ('length_in_minutes', int)
                               ])

loaders = [AlbumLoader]
最后的loaders是个列表,你可以放多个载入类进来,使其一次上传多个模型。
上传时别忘了加上--config_file=载入类的py文件参数。

然后就是上传了,执行的命令类似这样:
appcfg.py upload_data --config_file=album_loader.py --filename=album_data.csv --kind=Album <app-directory>[
如果是本地开发服务器,需要加上--url=remote_api地址参数。

导出的话方法几乎相同,只不过用的导出类是bulkloader.Exporter,参数也改成了download_data

最后翻译一下参数:

上传:
appcfg.py upload_data [参数] <app文件夹>
  • --filename=...
    必需。所上传的CSV文件。

  • --kind=...
    必需。用于创建实体的模型名。

  • --config_file=...
    必需。一个Python源文件,里面定义或导入模型及载入类。

  • --loader_opts=...
    传入载入类的initialize()方法的参数,你可以在源文件里处理这些参数。

  • --log_file=...
    用于记录上传信息的文件。

  • --auth_domain=...
    允许使用的域名。如果是用Google Apps域名,且设置了需要登录Google Apps账号,则需要在这设置域名。

  • --num_threads=#
    上传线程数,默认为10。

  • --batch_size=#
    每个remote_api call上传的实体数,默认为10。

  • --bandwidth_limit=#
    最大上传带宽,默认为250,000字节/秒。

  • --rps_limit=#
    每秒最多上传的记录数,默认为20。

  • --http_limit=#
    每秒最多发出的HTTP请求数,默认为7.5。

  • --db_filename=...
    用于进度记录的文件(主要是用于断点续传)。如果没指定,则使用bulkloader-progress-时间戳作为文件名。如果设为skip,则不记录。

  • --has_header
    如果CSV文件第一行不是数据,而是字段名的话,需要设置这个参数。

  • --app_id=...
    应用程序ID。如果和app.yaml里不一样的话,可以在这设置。

  • --url=...
    设置remote_api handler(主要用于本地开发服务器)。默认使用app.yaml里的定义。

下载:
appcfg.py download_data [参数] <app文件夹>
参数包含上传的所有参数,并增加一个:
  • --result_db_filename=...
    和上传所用的db_filename参数类似,也是用于记录进度的。默认文件名为bulkloader-results-时间戳

0条评论 你不来一发么↓

    想说点什么呢?