Группы объектов и транзакции Google AppEngine

#google-app-engine

#google-app-engine

Вопрос:

Я пытаюсь заставить транзакцию работать в AppEngine, и я сталкиваюсь с проблемами с группами объектов. Мой код немного похож на этот:

 parent_obj = ClassA.all().get()

def txn():
  key_name = 'hash of something here'

  if not db.get(db.Key.from_path('ClassB', key_name, parent=parent_obj)):
    obj = ClassB(
      parent = parent_obj
    )
    obj.put()

db.run_in_transaction(txn)
  

…но я получаю сообщение об ошибке «Невозможно работать с разными группами объектов в транзакции». Чего я не понимаю, так это того, что, насколько я вижу, моя транзакция работает только с объектами в той же группе. А именно, запросы в строке 6 с ‘parent’, который совпадает с ‘parent’, заданным в строке 8, поэтому оба запроса относятся к одной и той же группе объектов.

Мне остается сделать вывод, что мое понимание групп сущностей неверно. Но как? Я несколько раз прочитал документы и все еще не понимаю, почему то, что я делаю, неправильно.

Есть идеи? Спасибо!

Ответ №1:

Вероятно, это происходит потому, что parent_obj есть None и вы не передаете key_name при создании ClassB . В этом случае у вас есть несколько групп сущностей (каждая сущность без предка является отдельной группой).

Это сработало бы, если parent_obj является None или нет:

 parent_obj = ClassA.all().get()

def txn():
  key_name = 'hash of something here'

  if not db.get(db.Key.from_path('ClassB', key_name, parent=parent_obj)):
    obj = ClassB(
      key_name = key_name,
      parent = parent_obj
    )
    obj.put()

db.run_in_transaction(txn)
  

Комментарии:

1. Большое спасибо, Мораес, я думаю, ты прав. В моей ситуации parent_obj не был None, хотя я был настолько убежден, что то, что я делал, было правильным, что я отправил свой код на рабочий сервер, и, о чудо, это сработало. Итак, я перезапустил GoogleAppEngine launcher, и он тоже начал работать локально. Понятия не имею, что это вообще такое!

2. Имейте в виду, что в вашем коде ошибка: вы не создаете объект с заданным key_name. Вы проверяете, существует ли что-то, и если нет, вы создаете что-то другое.

3. Спасибо, эта ошибка возникла в процессе упрощения задачи для публикации здесь.