如何种子谷歌的NDB(应用程序引擎存储)

时间:2014-01-21 12:21:05

标签: google-app-engine model app-engine-ndb seeding

我是NDB用户,这个对象数据库非常酷。但是如何在部署后直接为特定的默认值设定种子?是否有一些预定义的功能或标准化的数据库播种方式?

例如:

我有以下 ndb.Model ,想要某种“现有的默认父级”。

Category(ndb.Model):
    name = ndb.StringProperty(required=True)
    parent = ndb.KeyProperty(kind='Category',required=True, 
                   default=<KeyOfRootCategory>)

在哪里放置以下播种值?

main_category = Category(name="all", parent=None) #this is the root category
main_category.put()

3 个答案:

答案 0 :(得分:2)

为什么不在部署后创建一个简单的种子处理程序来调用(例如/ seeding / example)?我看到它的方式你只需要种子一次,所以不需要某种钩子。

seed.py:

class ExampleHandler(webapp2.RequestHandler):

    def get(self):

        # Do your thing
        # Maybe use "get_or_insert()". See [1]

        return

app = webapp2.WSGIApplication(
    [
        ('/example', ExampleHandler),
    ],
    debug=True

)

然后在你的app.yaml:

- url: /seeding/.*
  script: seed.app
  login: admin

最后一行至关重要。它可以保护您的播种脚本免受未经授权的访问(参见[2])。

[1] https://developers.google.com/appengine/docs/python/ndb/modelclass#Model_get_or_insert

[2] https://developers.google.com/appengine/docs/python/config/appconfig#Python_app_yaml_Requiring_login_or_administrator_status

答案 1 :(得分:2)

看起来没有专门的&#39;部署后&#39;挂钩。我只是将一些代码放入主处理程序脚本(包含&#39; webapp2.WSGIApplication(...)&#39;)中,检查根类别是否已存在,如果不存在则创建它。或者,这可能是某些处理程序操作的一部分。

答案 2 :(得分:0)

我想我明白你在问什么。

您无需创建实体即可创建父键。这将定义您的实体组。

或者,它不需要父母,但是将成为任何孩子的父母。任何没有在密钥中定义的父项的实体成为它自己的实体组的根,并且该实体组可以有1个或多个成员(即其本身和任何子项。)