通过bulk loader可以批量上传下载数据,GAE支持xml,csv格式数据批量上传,以及xml,csv和文本格式下载。
你可以选择自动生成一个bulkloader.yaml,或者手动编码来写一个bulk loader。谷歌不推荐手动编写,个人也觉得自动生成才是王道。
如何自动生成bulkloader.yaml
bulkloader.yaml是一个描述数据格式的配置文件,格式例如xml或csv。bulk loader进行数据导入时需要这个配置文件来将外部数据(xml或csv)转换为中间数据——python字典类型,然后将中间数据——python字典转换为Google Engine Datastore的Entity数据。下载数据时,转换顺序则反过来。
执行以下命令自动生成bulkloader.yaml:
$ appcfg.py create_bulkloader_config --filename=bulkloader.yaml --url=http://your_app_id.appspot.com/_ah/remote_api
这个命令会在当前目录下创建一个bulkloader.yaml文件,一般说来你还要对这个原始的bulkloader.yaml文件进行配置才能满足你对数据传递的要求。
配置bulkloader.yaml文件
bulkloader.yaml文件主要包含两部分python_preamble和transformers。
python_preamble: - import: google.appengine.ext.bulkload.transform - import: google.appengine.ext.db - import: re - import: base64
一般来说,这部分你都不用修改,除非你要在转换格式中用到其他模块或方法,例如我在这里增加了datetime。
python_preamble: - import: base64 - import: re - import: google.appengine.ext.bulkload.transform - import: google.appengine.ext.bulkload.bulkloader_wizard - import: google.appengine.ext.db - import: google.appengine.api.datastore - import: google.appengine.api.users - import: datetime
第二部分transformers是用来描述数据类型的,其中包含一个或多个kind,视你在datastore中kind数量而定。每个kind中又包括以下内容:
- connector:用来指定输入输出格式,值为xml,csv或文本。
- connector_options:connector的一些属性。
- property_map:每个字段的映射关系(即转换关系)。
配置bulkloader.yaml的第一步就是设置connector,谷歌默认的是csv格式,无论输入输出都要求csv首行是字段名称。connector为:simplexml, csv, simpletext。
connector的配置参数可以在谷歌文档找到。
对property而言:
- property:datastore中的字段名称。
- external_name:xml的tag名称,或者csv首行中的字段名。
- import_transform:上传时的数据格式,或者是数据转换规则。
- export_transform:下载时的数据格式,或者是数据转换规则。
property和external_name是必须的,如果只是想要上传或者下载的话,可以注释掉export_transform或者import_transform。
关于simplexml
bulkloader.yaml中的simplexml目前只支持简单的xml结构,例如:
<book> <article> <author>John Kerry</author> <title>How is it, China</title> <content>Yes, there is a huge population.</content> </article> </book>
在bulkloader.yaml中配置为:
connector: simplexml
connector_options:
xpath_to_nodes: /book/article
style: element_centric
datastore中的每一条entity会作为一个article输出,author, title, content之间不能互相嵌套,不能有层级关系。style具有两个值element_centric或者attribute_centric,意思是根据xpath找到的node,是使用它的属性值作为数据还是它的子节点作为数据来进行转换。
在你的GAE应用数据模型中,或许你设置一个自动添加创建日期的字段,例如create_date。
这时你应该这样配置 import_transform: "lambda x: datetime.datetime.now()"。
上传下载数据:
当配置完成bulkloader.yaml后,就可以开始使用它来传递数据了。你不是一定要把bulkloader.yaml放在你的应用文件夹中,你可以放在任意文件夹中,然后在命令行切换到该文件夹,执行以下命令:
$ appcfg.py download_data --application=s~ifantastic-dragon --auth_domain=gmail.com --url=https://ifantastic-dragon.appspot.com/_ah/remote_api --kind=Wordroot --config_file=bulkloader.yaml --filename=x.xml
因为GAE的不稳定,我也不是每次都成功,但以上的命令是成功最高的。虽然我也觉得有点无稽,但还是请保持以上的参数顺序,貌似以上顺序是最优的。
附:如何下载GAE源代码
谷歌为GAE编写了多种语言说明,但并不是所有语言都得到了最好的更新。经验之谈的博文可以帮助理解,但想要最好地理解GAE,还是读官方文档,而英文文档是最佳选择。
例如我曾在华蟒邮件列表看到有人抱怨GAE不能下载源文档,而事实是在谷歌中文文档缺少了如何下载源代码这一小节,但在英文文档中可以找到。
要下载GAE App源代码,在命令行或者终端中执行以下命令:
appcfg.py download_app -A <your_app_id> -V <your_app_version> <output-dir>
实例:$ appcfg.py download_app -A ifantastic-dragon -V 5 /Downloads/GaeApp 1 2 3 1 - 应用的id号 2 - 应用的版本号 3 - 下载目的地目录,如果不传入<output-dir>,则下载到当前目录,前提是当前目录为空。
执行命令后,会出现以下代码并要求输入App所有者的帐号和密码:
Getting file list... Email: <admin-id>@example.com #输入帐号(邮箱) Password for <admin-id>@example.com: #输入密码 Fetching files... Getting files... [1/5] request.py [2/5] login.py [3/5] static/screen.css [4/5] static/print.css [5/5] images/bird.png
你可以在GAE App控制台点击Versions,在出现的页面中选择 permanently prohibit code downloads。[注意]这个步骤是不可逆的,一旦选择永久禁止代码下载,则永远不能再下载这个应用的源代码了。