初始化具有相关实体的数据存储的最佳方法

时间:2016-05-08 12:50:58

标签: google-app-engine google-cloud-datastore

要运行我的应用,我需要一些静态实体,

所以我决定通过Remote API从CSV文件上传w / bulkloader。

但我有一些实体之间有关系。 像:

- kind: Category
  properties:
  - name: name

- kind: SubCategory
  ancestor: yes
  properties:
  - name: parent_id
  - name: name

我应该如何创建csv数据呢? 是否还有其他方法可以用来初始化我的应用数据存储区?

1 个答案:

答案 0 :(得分:1)

如果您定义键值(作为字符串),则可以使用这些值创建csv文件。一个文件将包含类别值category_key,name。另一个文件将包含SubCategory值subcategory_key,category_key,name。例如,

cat1,Category 1
cat2,Category 2

subcat1,cat1,SubCategory 1
subcat2,cat1,SubCategory 2
subcat3,cat2,SubCategory 3

您可以逐行读取文件,并从数据中创建静态实体(在Python中):

import csv

with open('categories.csv') as csvfile:
    categories = csv.reader(csvfile)
    for row in categories:
        Category.get_or_insert(row[0], name=row[1])

with open('subcategories.csv') as csvfile:
    subcategories = csv.reader(csvfile)
    for row in subcategories:
        SubCategory.get_or_insert(row[0], parent_id=ndb.Key(Category, row[1]), name=row[2])

parent_id值构造为键。两个循环都使用get_or_insert()函数来防止重复值,因此您可以多次运行它。

我看到SubCategory有一个祖先,所以你可以用这个替换最后一个调用(并删除parent_id属性):

        SubCategory.get_or_insert(row[0], parent=ndb.Key(Category, row[1]), name=row[2])