Как мне обновить информацию в моем хранилище данных? - PullRequest
2 голосов
/ 07 ноября 2010

Мне нужно проверить, находится ли элемент в хранилище данных, прежде чем обновить его.

У меня есть 2 списка: UNIQUES = ["B","K","V"] и COUNTS = [5, 10, 3]

Это модель:

class Rep(db.Model):
    mAUTHOR = db.UserProperty(auto_current_user=True)
    mUNIQUE = db.TextProperty()
    mCOUNT = db.IntegerProperty()
    mDATE = db.DateTimeProperty(auto_now_add=True)

Эта функция обновляет базу данных:

def write_to_db(S, C):
    REP = Rep(mUNIQUE=S, mCOUNT=C)
    db.put(REP)

Вдохновленная этой страницей Я пытаюсь:

for i in range(len(UNIQUES)):            
    C_QUERY = Rep.all()
    C_QUERY.filter("mAUTHOR =", user)
    C_QUERY.filter("mUNIQUE =", UNIQUES[i])
    C_RESULT = C_QUERY.fetch(1)
    if C_RESULT:
        C = C_RESULT.mCOUNT + COUNTS[i]
        S = db.Text(UNIQUES[i])
        write_to_db(S,C)
    else:
        C = COUNTS[i]
        S = UNIQUES[i]
        write_to_db(S, C)

Но результат не тот, который яожидать.C_RESULT всегда пуст;и вместо обновления создается новая запись.Что я делаю неправильно?Спасибо!

EDIT3: проблема решена

Согласно комментарию Дэвида Андерхилла, я обновил код, и теперь он работает.

        if C_RESULT:
            rep=C_RESULT[0]
            rep.mCOUNT+=COUNTS[i]
            rep.put()

РЕДАКТИРОВАТЬ 2: Связанный вопрос

Как мне обновить этот запрос и вернуть его с обновленной информацией?

C_QUERY = Rep.all()
C_QUERY.filter("mAUTHOR =", user)
C_QUERY.filter("mUNIQUE =", UNIQUES[i])
C_RESULT = C_QUERY.fetch(1)                

Я хочу изменить mCOUNT и затем записать его в хранилище данных.Как мне это?Это похоже на то, что они делают в этой странице , но я не мог заставить это работать.Спасибо за вашу помощь.

РЕДАКТИРОВАТЬ

Я обновил код в соответствии с ответом Дэвида Андерхилла.Это решило проблему (но функциональность не правильная. Я не уверен, что это должен быть другой вопрос).

    for i in range(len(UNIQUES)):                        
        C_QUERY = Rep.all()
        C_QUERY.filter("mAUTHOR =", user)
        C_QUERY.filter("mUNIQUE =", UNIQUES[i])
        C_RESULT = C_QUERY.fetch(1)                
        if C_RESULT:
            C = C_RESULT[0].mCOUNT + COUNTS[i]
            S = UNIQUES[i]
            write_to_db(S, C)
        else:
            C = COUNTS[i]
            S = UNIQUES[i]
            write_to_db(S, C)

1 Ответ

1 голос
/ 07 ноября 2010

Проблема в том, что запрос пытается отфильтровать mUNIQUE. Однако вы объявили mUNIQUE как db.TextProperty, что никогда не индексируется . В результате ваш запрос никогда не находит никаких результатов.

Решение : Измените mUNIQUE на db.StringProperty (который равен , проиндексирован по умолчанию).

Вам также следует рассмотреть возможность обновления Rep в транзакции - текущему коду может не удастся добавить свойство COUNTS[i], если два запроса пытаются обновить один и тот же объект одновременно.

Кроме того, вы можете обновить S = db.Text(UNIQUES[i]) до S = UNIQUES[i].

...