初始化带有相关实体的数据存储的最佳方法
Best way to initialize datastore w/ related entities
为了 运行 我的应用程序,我需要一些静态实体,
所以我决定通过 Remote API 使用 bulkloader 从 CSV 文件上传它们。
但我有一些实体之间存在关系。
喜欢:
- kind: Category
properties:
- name: name
- kind: SubCategory
ancestor: yes
properties:
- name: parent_id
- name: name
我应该如何创建一个csv数据来制作它?
我应该采取任何其他方式来初始化我的应用程序数据存储吗?
如果您定义键值(作为字符串),那么您可以使用这些值创建 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])
为了 运行 我的应用程序,我需要一些静态实体,
所以我决定通过 Remote API 使用 bulkloader 从 CSV 文件上传它们。
但我有一些实体之间存在关系。 喜欢:
- kind: Category
properties:
- name: name
- kind: SubCategory
ancestor: yes
properties:
- name: parent_id
- name: name
我应该如何创建一个csv数据来制作它? 我应该采取任何其他方式来初始化我的应用程序数据存储吗?
如果您定义键值(作为字符串),那么您可以使用这些值创建 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])