Google App Engine Datenbankwerte nicht erhöht wird
-
22-09-2019 - |
Frage
Hier ist ein Code, der nicht funktioniert, wie es funktionieren soll. Jedes Mal, wenn die Datenbank abgefragt wird, bekomme ich entweder einen 0 oder 1 Wert für die Optionen und die Werte in der Datenbank nicht Schritt, auch wenn, wie, wie Sie sehen können, in Zeile 86 und 89 werden die Werte erhöht werden. Jede Idee, was falsch läuft hier? Ich verwende Django auf 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()
Lösung
Sie verwenden nie fetch () , um tatsächlich die GqlQuery ausführen, dass Sie in Zeile erstellen 80.
Versuchen Sie diese:
country_wide_data = db.GqlQuery("SELECT * FROM CountryWideData WHERE country = :1 AND questionNo = :2", user_country, question_number).fetch()
Übrigens, Sie werden dieses Inkrementieren innerhalb einer Transaktion wollen, zu tun; Andernfalls erhalten Sie eine Race-Bedingung, wenn mehr als eine Anforderung diesen Code ausführen kann, und die Zählungen ungenau. Die Dokumentation zu Transaktionen ist hier: http://code.google.com /appengine/docs/python/datastore/transactions.html
Im Allgemeinen, werden Sie den Code übernehmen wollen, dass diese Entitäten oder aktualisiert erstellt und sie in Funktionen setzen, wie folgt aus:
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()
Dann können Sie diese Funktionen aufrufen mit der db.run_in_transacation Methode, wie folgt aus:
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)