2010-02-22 2 views
1

Voici un code qui ne fonctionne pas correctement. Chaque fois que la base de données est interrogée, j'obtiens une valeur 0 ou 1 pour les options, et les valeurs dans la base de données n'augmentent pas, même si comme vous pouvez le voir, aux lignes 86 et 89, les valeurs sont incrémentées. Une idée de ce qui ne va pas ici? J'utilise Django sur le moteur Google App.Les valeurs de la base de données du moteur de l'application Google ne s'incrémentent pas

 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() 

Répondre

3

Vous n'utilisez fetch() pour exécuter l'GqlQuery que vous créez dans la ligne 80.

Essayez ceci:

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

Par ailleurs, vous allez vouloir faire cela en incrémentant à l'intérieur d'une transaction; sinon, vous obtiendrez une condition de concurrence si plus d'une requête peut exécuter ce code, et les comptes seront inexacts. La documentation sur les transactions est ici: http://code.google.com/appengine/docs/python/datastore/transactions.html

En général, vous allez vouloir prendre le code qui crée ou met à jour ces entités et les mettre en fonctions, comme ceci:

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() 

Ensuite, vous pouvez appeler ces fonctions en utilisant la méthode db.run_in_transacation, comme ceci:

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

Merci Adam! Bien que fetch ait besoin d'un argument. fetch (1) a fonctionné pour moi. – msk

+0

Adams, un code d'exemple de la façon dont vous allez mettre à jour les valeurs en utilisant une transaction? On dirait que GQL n'autorise pas les instructions de mise à jour. :/ – msk

+0

Shuaib: Pour exécuter une transaction, supprimez toutes vos instructions put et, immédiatement après votre boucle, ajoutez: dp.put (country_wide_data). – dannyroa

Questions connexes