Как засеять NDB Google (хранилище движка приложения)

Я пользователь 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()

person NaN    schedule 21.01.2014    source источник


Ответы (3)


Не похоже, что для этого есть специальные хуки после развертывания. Я бы просто поместил код в основной сценарий обработчика (тот, который содержит 'webapp2.WSGIApplication (...)'), проверяя, существует ли уже корневая категория, и создавал бы ее, если нет. В качестве альтернативы это может быть частью некоторого действия обработчика.

person joerx    schedule 02.05.2014

Почему бы не создать простой обработчик заполнения для вызова после развертывания (например, / 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

person Matthias Eisen    schedule 21.01.2014

Думаю, я понимаю, о чем вы спрашиваете.

Вы можете создать родительский ключ, не создавая сущность. Это определит вашу группу сущностей.

В качестве альтернативы ему не нужен родитель, но он будет родителем любого дочернего элемента. Любая сущность без родителя, определенного в ключе, становится корнем своей собственной группы сущностей, и эта группа сущностей может иметь 1 или более членов (то есть сама и любые дочерние элементы).

person Tim Hoffman    schedule 21.01.2014