关于下载 GAE High Replication Datastore 数据[实战篇]下

通过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中又包括以下内容:

  1. connector:用来指定输入输出格式,值为xml,csv或文本。
  2. connector_options:connector的一些属性。
  3. 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。[注意]这个步骤是不可逆的,一旦选择永久禁止代码下载,则永远不能再下载这个应用的源代码了。

posted @ 2013-04-14 18:48  iFantasticMe  阅读(1068)  评论(0编辑  收藏  举报