2011-08-07 23 views
0

我試圖用我自己的鍵創建數據存儲中的記錄:如何獲取用db.run_in_transaction記錄創建的密鑰?

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: Invalid string key 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) 

回答

3

你傳遞一個KEY_NAME,所以你應該使用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()會返回實體鍵。