Я пытаюсь создать модель данных ядра приложения Google со следующими атрибутами:
- сохранить строку, пару значений в BigTable
- если строка, пара значений НЕ существует, создайте запись
- если строка, пара значений существует, обновите запись, увеличив счетчик
код:
class stringListRecord(db.Model):
type = db.StringProperty();
value = db.StringProperty();
refs = db.IntegerProperty(default=1);
def __init__(self, *args, **kw):
key = db.GqlQuery("SELECT __key__ FROM stringListRecord WHERE type = :1 AND value = :2", kw['type'], kw['value']).get();
if key != None:
kw['key'] = key;
db.Model.__init__(self, *args, **kw);
def increment_counter(self, key):
obj = db.get(key);
obj.refs += 1;
db.Model.put(obj);
def put(self):
if self.key() != None:
self.increment_counter(self.key());
#db.run_in_transaction(self.increment_counter, self.key());
else:
db.Model.put(self);
Когда я запускаю закомментированный код, то есть db.run_in_transaction (), я получаю:
Only ancestor queries are allowed inside transactions.
Есть ли лучший способ получить эту функциональность от GAE?