سؤال

فيما يلي بعض التعليمات البرمجية التي لا تعمل كيف من المفترض أن تعمل. في كل مرة يتم فيها الاستعلام عن قاعدة البيانات ، أحصل على قيمة 0 أو 1 للخيارات ، والقيم في قاعدة البيانات لا تزيد ، على الرغم من أن ترى ، في السطران 86 و 89 ، يتم زيادة القيم. أي فكرة ماذا يحدث هنا؟ أنا أستخدم Django على محرك تطبيق Google.

        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()
هل كانت مفيدة؟

المحلول

أنت لا تستخدم أبدا أحضر() لتنفيذ 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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top