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()
War es hilfreich?

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top