Как получить ключ созданного с записью db.run_in_transaction? - PullRequest
0 голосов
/ 07 августа 2011

Я пытался создать запись в хранилище данных с помощью своего собственного ключа:

class Counter(db.Model):
    counter = db.IntegerProperty()

def increase_counter(key):
    obj = db.get(key)
    if obj is None:
        obj = Counter(key_name=key, counter=1)
    else:
        obj.counter += 1
    obj.put()

db.run_in_transaction(increase_counter, "z"+intValue1+"_"+intValue2+"_"+intValue3)

Возвращает

BadKeyError: Неверный строковый ключ z523068_139840081_879156.

Поскольку это не работает, как я могу узнать, какой ключ создан для моей записи?Можно ли использовать db.Key() с db.run_in_transaction?Как мне сначала создать счетчик, а затем увеличить значение с помощью автоматически сгенерированного ключа?

Upd. Я также попробовал следующее:

def increase_counter(key):
    if key is None:
        obj = Counter(counter=1)
    else: 
        obj = db.get(key)
        obj.counter += 1
    obj.put()
    return obj.key()

db_counter_key = None # initially we don't have key value
for argument in files_arguments:
    db_counter_key = db.run_in_transaction(increase_counter, db_counter_key)

1 Ответ

3 голосов
/ 07 августа 2011

Вы передаете имя ключа, поэтому вам следует использовать get_by_key_name вместо db.get:

class Counter(db.Model):
    counter = db.IntegerProperty()

def increase_counter(key_name):
    obj = Counter.get_by_key_name(key_name)
    if obj is None:
        obj = Counter(key_name=key_name, counter=1)
    else:
        obj.counter += 1
    return obj.put()

db.run_in_transaction(increase_counter, "z"+intValue1+"_"+intValue2+"_"+intValue3)

Редактировать.Если вам действительно нужно передать ключ, вы можете использовать это:

def increase_counter(key, amount=1):
    obj = db.get(key) if key else None
    if obj:
        obj.counter += amount
    else:
        obj = Counter(counter=amount)

    return obj.put()

db_counter_key = None # initially we don't have key value
db_counter_key = db.run_in_transaction(increase_counter, db_counter_key, 
                                       amount=len(files_arguments))

(следуя вашему примеру, вам не нужно запускать несколько транзакций, и вместо этого вы можете передать аргумент amount в качестве значения приращения)

Обратите внимание, что вы можете вернуть obj.put(), потому что put() возвращает ключ сущности.

...