我花了至少兩個小時試圖讓這個工作。我在SO和Google羣組中看到了很多不同的問題,但沒有一個答案似乎適用於我。AppEngine bulkloader通過設置key_name上傳實體
問:如何批量上傳數據如下到數據存儲的CSV文件,以創建具有在CSV文件中定義的KEY_NAME(相同的結果,使用下面的附加功能)實體。
這是我的模型:
class RegisteredDomain(db.Model):
"""
Domain object class. It has no fields because it's existence is
proof that it has been registered. Indivdual registered domains
can be found using keys.
"""
pass
下面是我通常添加/刪除域等:
def add(domains):
"""
Add domains. This functions accepts a single domain string or a
list of domain strings and adds them to the database. The domain(s)
must be valid unicode strings (a ValueError is thrown if the domain
strings are not valid.
"""
if not isinstance(domains, list):
domains = [domains]
cleaned_domains = []
for domain in domains:
clean_domain_ = clean_domain(domain)
is_valid_domain(clean_domain_)
cleaned_domains.append(clean_domain_)
domains = cleaned_domains
db.put([RegisteredDomain(key_name=make_key(domain)) for domain in domains])
def get(domains):
"""
Get domains. This function accepts a single domain string or a list
of domain strings and queries the database for them. It returns a
dictionary containing the domain name and RegisteredDomain object or
None if the entity was not found.
"""
if not isinstance(domains, list):
domains = [domains]
entities = db.get([Key.from_path('RegisteredDomain', make_key(domain)) for domain in domains])
return dict(zip(domains, entities))
注:在上面的代碼make_key只是使域小寫,並預置一'D'。
就是這樣。現在我瘋了試圖從一個CSV文件上傳一些RegisteredDomain實體。下面是CSV文件(注意第一個字符「d」是有原因的事實,鍵名可能不以數字開頭):
key
dgoogle.com
dgoogle11.com
dfacebook.com
dcool.com
duuuuuuu.com
dsdsdsds.com
dffffooo.com
dgmail.com
我一直沒能自動生成bulkloader YAML文件,因爲應用引擎仍未更新我的數據存儲區統計信息(1天加上幾個小時)。因此,這(和許多類似的排列)是我想出了(主要是改變import_transform位):
python_preamble:
- import: google.appengine.ext.bulkload.transform
- import: google.appengine.api.datastore
- import: google.appengine.ext.db
- import: utils
- import: bulk_helper
transformers:
- kind: RegisteredDomain
connector: csv
connector_options:
encoding: utf-8
property_map:
- property: __key__
external_name: key
export_transform: bulk_helper.key_to_reverse_str
import_template: transform.create_foreign_key('RegisteredDomain')
現在,出於某種原因,當我嘗試上傳的說,一切都很好,X實體已經轉移等,但沒有任何更新的數據存儲(正如我可以從管理控制檯看到的)。這是我如何上傳:
appcfg.py upload_data --application=domain-sandwich --kind=RegisteredDomain --config_file=bulk.yaml --url=http://domain-sandwich.appspot.com/remote_api --filename=data.csv
最後這是我的數據存儲瀏覽器的樣子:
注:我將Dev-服務器和AppEngine上這樣做(無論工作.. )。
感謝您的幫助!