Les valeurs de base de données Google App Engine n'incrémenter
-
22-09-2019 - |
Question
Voici un code qui ne fonctionne pas comment il est censé fonctionner. Chaque fois que la base de données est interrogé, je reçois un 0 ou 1 valeur pour les options et les valeurs de base de données n'incrémente pas, même si, comme vous le voyez, dans la ligne 86 et 89, les valeurs sont incrémentées. Toute idée de ce qui ne va pas ici? J'utilise Django sur Google App Engine.
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()
La solution
Vous ne jamais utiliser 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 le faire à l'intérieur d'une incrémentation transaction; sinon, vous obtiendrez une condition de course si plus d'une demande peut exécuter ce code, et les compteurs 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 à l'aide du db.run_in_transacation méthode, 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)