2010-02-22 68 views
1

这是一些代码,它不应该如何工作。每次查询数据库时,我都会得到0或1的值,而数据库中的值不会增加,即使正如您所看到的,在第86和89行中,值也会递增。任何想法这里有什么问题?我在Google App引擎上使用Django。谷歌应用程序引擎数据库值不增加

 user_result = request.POST['json'] 
65  user_result = json.loads(user_result) 
66  user_country = get_user_country(user_result) 
67  question_number = get_question_number(user_result) 
68  answered_option = get_answered_option(user_result) 
69 
70  country_option_1 = 0 
71  country_option_2 = 0 
72  world_option_1 = 0 
73  world_option_2 = 0 
74 
75  """ 
76  Get already existing record for the question for the contry, or create 
77  new one and put/update in db 
78  """ 
79 
80  country_wide_data = db.GqlQuery("SELECT * FROM CountryWideData WHERE country = :1 AND questionNo = :2", user_country, question_number) 
81  flag = False 
82  for i in country_wide_data: 
83   flag = True 
84  if flag: 
85   if answered_option==1: 
86    country_wide_data[0].optionOne = country_wide_data[0].optionOne + 1 
87 
88   elif answered_option==2: 
89    country_wide_data[0].optionTwo = country_wide_data[0].optionTwo + 1 
90   country_option_1 = country_wide_data[0].optionOne 
91   country_option_2 = country_wide_data[0].optionTwo 
92   country_wide_data[0].put() 
93  else: 
94   country_wide_data = CountryWideData(country=user_country, questionNo=question_number) 
95 
96   if answered_option==1: 
97    country_wide_data.optionOne = 1 
98    country_wide_data.optionTwo = 0 
99   elif answered_option==2: 
100    country_wide_data.optionOne = 0 
101    country_wide_data.optionTwo = 1 
102   country_option_1 = country_wide_data.optionOne 
103   country_option_2 = country_wide_data.optionTwo 
104   country_wide_data.put() 

回答

3

你永远使用取()实际执行您在行创建GqlQuery 80

试试这个:

country_wide_data = db.GqlQuery("SELECT * FROM CountryWideData WHERE country = :1 AND questionNo = :2", user_country, question_number).fetch() 

顺便说一句,你要想要在事务内部进行递增;否则,如果有多个请求可以执行此代码,则会收到竞争条件,并且计数将不准确。对交易的文档是在这里:http://code.google.com/appengine/docs/python/datastore/transactions.html

一般情况下,你将要采取的创建或更新这些实体的代码,并把它们放到功能,像这样:

def increment_existing_data(key, answered): 
    cwd_to_incr = db.get(key) 
    if answered == 1: 
     cwd_to_incr.optionOne += 1 
    elif answered == 2: 
     cwd_to_incr.optionTwo += 1 
    cwd_to_incr.put() 

def create_new_data(answered, user_country, question_number): 
    new_data = CountryWideData(country=user_country, questionNo=question_number) 
    if answered == 1: 
     new_data.optionOne = 1 
     new_data.optionTwo = 0 
    elif answered == 2: 
     new_data.optionOne = 0 
     new_data.optionTwo = 1 
    new_data.put() 

然后,你可以调用这些功能使用db.run_in_transacation方法,像这样:

country_wide_data = db.GqlQuery("SELECT * FROM CountryWideData WHERE country = :1 AND questionNo = :2", user_country, question_number).get() 
if country_wide_data is not None: 
    db.run_in_transaction(increment_existing_data, country_wide_data.key(), answered_option) 
else: 
    db.run_in_transaction(create_new_data, answered_option, user_country, question_number) 
+0

感谢亚当!虽然获取需要一个参数。 fetch(1)为我工作。 – msk 2010-02-22 14:30:37

+0

Adams,你将如何使用事务更新值的示例代码?看起来像GQL不允许更新语句。 :/ – msk 2010-02-22 15:17:53

+0

Shuaib:要执行交易,请删除所有put语句,并立即在循环后添加:dp.put(country_wide_data)。 – dannyroa 2010-02-22 23:11:39