#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. Спасибо, эта ошибка возникла в процессе упрощения задачи для публикации здесь.