Как Model.get_or_insert () является транзакцией предка в движке приложения - PullRequest
0 голосов
/ 07 марта 2012

Я не понимаю, как работает механизм приложений Google для метода Model.get_or_insert(key_name, **kwds) в python.

Насколько я понимаю, все операции с хранилищами данных внутри транзакции должны быть запросами предка.Однако я не вижу, как документация для Model.get_or_insert(key_name, **kwds) является запросом предка.В следующем примере, поскольку «parent» не указан в аргументах для последней строки, не будет ли результат parent=kwds.get('parent') во второй строке None, что приведет к отрицанию запроса как запроса предка?:

def txn(key_name, **kwds):
    entity = Story.get_by_key_name(key_name, parent=kwds.get('parent')) # parent is not defined?
    if entity is None:
        entity = Story(key_name=key_name, **kwds)
        entity.put()
    return entity

def get_or_insert(key_name, **kwargs):
    return db.run_in_transaction(txn, key_name, **kwargs)

get_or_insert('some key', title="The Three Little Pigs")  # no parent specified

( ссылка на документацию )

Я не пытаюсь тут расстаться, у меня просто проблемы с пониманием, как правильно использовать транзакции в моем собственном приложениии искал эту документацию, чтобы улучшить мое понимание.

Большое спасибо за вашу помощь!

Ответы [ 2 ]

3 голосов
/ 07 марта 2012

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

Ключевые пути / предки определяют, как данные хранятся в хранилище данных App Engine. Объекты с общим предком хранятся в одном и том же сегменте базы данных, что упрощает реализацию атомарных транзакций без синхронизации между фрагментами.

Если вы используете HRD, которым вы, вероятно, являетесь в данный момент, также доступны транзакции кросс-групп, хотя я не слишком уверен в том, как они работают за сценой. http://code.google.com/appengine/docs/python/datastore/overview.html#Cross_Group_Transactions

1 голос
/ 07 марта 2012

Вы можете передать None предка, если у вас есть только один объект в транзакции.
Попытка создать / получить более одной сущности вызовет исключение.

...