GAE的批量上传下载数据
2009 5 15 11:33 AM 2889次查看
分类:Google App Engine 标签:Python, Google App Engine
之前没翻译是因为这个工具尚未完善,不过现在看上去不会有较大改动了。
先给英文文档地址,然后开始介绍。
一般的数据库都是可以直接导入导出数据的,例如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步:
- 定义模型
- 定义载入类
导入文件是个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条评论 你不来一发么↓