如何在使用批量加载器时填充app引擎中的“ID”字段?

时间:2013-02-19 09:24:49

标签: google-app-engine bulkloader bulk-load

datastore viewer

已更新:见下文

我已经想出如何为我的数据集填充Key Name字段,这样我现在已经将写操作减少了2(从8减少)。但我还有这个额外的空列“ID”。我已经尝试了bulkloader.py的各种配置,但我无法填充该列,并希望进一步减少我的写操作...

这就是我所拥有的:

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

transformers:

- kind: Word
  connector: csv 

  property_map:
    - property: __key__
      external_name: word
      export_transform: transform.key_id_or_name_as_string

    - property: ID
      external_name: ID  
      # How to configure this one to use up that silly empty column called "ID"?

    - property: otherlangs
      external_name: otherlangs

这是我的csv文件的标题和一些示例行:

$ head allting.csv
ID,word,otherlangs
100,a,it|uno|
200,aaltos,fi|aaltojen|
300,aardvark,is|jarðsvín|nl|aardvarken|

更新: 好吧,我发现了如何以“Key Name”列为代价来填充“ID”列...

我将bulkload.py更改为:

transformers:

- kind: Word
  connector: csv
  connector_options:
    encoding: utf-8
    columns: from_header
  property_map:
    - property: __key__
      external_name: id
      export_transform: transform.key_id_or_name_as_string
      import_transform: transform.create_foreign_key('id', key_is_id=True)

    - property: word·
      external_name: word·

    - property: otherlangs·
      external_name: otherlangs·

csv文件如下所示:

id,word,otherlangs
100,a,it|uno|
200,aaltos,fi|aaltojen|
...

数据存储查看器中的输出现在看起来像这样:

datastore viewer as it looks now

仍然想知道是否有任何方法可以填充ID和“密钥名称”列 并将写操作降为4?

1 个答案:

答案 0 :(得分:0)

由于没有人对这个问题有任何想法,我将记录我提出的这个解决方法。

通过对bulkload.yaml文件执行此操作,我能够将写操作降低到4

...
transformers:

- kind: Word
  connector: csv
  connector_options:
    encoding: utf-8
    columns: from_header
  property_map:
    - property: __key__
      external_name: word
      export_transform: transform.key_id_or_name_as_string

    - property: otherlangs
      external_name: otherlangs

将我的课改成这样:

class Word(db.Model):
  word = db.StringProperty(multiline=False)
  otherlangs = db.StringProperty(multiline=True)

  def __str__(self): #encode('utf8')
     return "word: " + str(self.key().name().encode('utf8')) + ", otherlangs: " + self.otherlangs.encode('utf8')

现在写操作是4,这很好:

write ops down to 4

在交互式控制台中查询变得更加棘手,我花了一些时间才弄明白。

from google.appengine.api import users
from google.appengine.ext.db.metadata import Namespace
import words

foo = words.Word.get_by_key_name('abalone')
print foo

产生:

word: abalone, otherlangs: fr|ormeaux|it|orecchie di mare|

我不明白的是......我怎样才能动态添加新单词,以便我可以将单词作为关键,就像批量上传者为我做的那样。但是我不会太担心这个问题,只要批量加载程序可以做到这一点,我觉得这一点已经足够好了。