Почему не работает обновление записи, полученной с использованием синтаксиса db.table [id]? - PullRequest
0 голосов
/ 17 апреля 2020

Я попробовал эти четыре способа обновления записи. Первые два описаны в книге. Третий выглядит так же, как второй, но он не работает. И четвертый выглядит так же, как первый. Но это тоже не работает. Какие здесь различия, которые мне не хватает?

    DeckID = 1

    db(db.Deck.id == DeckID).update(CardCriteria='This works')

    db.Deck[DeckID] = dict(CardCriteria='This works too')

    rec = db.Deck[DeckID]
    rec = dict(CardCriteria='This DOESNT work')

    db.Deck[DeckID].update(CardCriteria='This DOESNT work either')

1 Ответ

1 голос
/ 17 апреля 2020

Использование update

db(db.Deck.id == DeckID).update(CardCriteria='This works')

В приведенном выше примере db(db.Deck.id == DeckID) - это объект DAL Set - метод update выполняет обновление базы данных. Однако db.Deck[DeckID] является объектом DAL Row - он действует как словарь, поэтому метод update просто обновляет сам объект Row (он не выполняет обновление базы данных). Чтобы выполнить обновление базы данных, объект Row имеет метод update_record:

db.Deck[DeckID].update_record(CardCriteria='This works')

Вы также можете обновить объект Row локально, а затем вызвать update_record без аргументов, и он будет отправьте локальные обновления в базу данных:

rec = db.Deck[DeckID]
rec.update(CardCriteria='This works')
rec.update_record()

с использованием __setitem__

db.Deck[DeckID] = dict(CardCriteria='This works too')

В приведенном выше присваивании db.Deck[DeckID] запускается метод __setitem__ magi c объекта Row, который приводит к обновлению базы данных, а не к ключу DeckId, добавляемому к объекту таблицы db.Deck. Однако в этой строке:

rec = dict(CardCriteria='This DOESNT work')

вы просто переназначаете переменную rec в качестве словаря (метод __setitem__ magi c не запускается, потому что вы не используете object[key] = value синтаксис).

Обратите внимание, что эта же проблема применяется вне контекста DAL:

>>> mydict = dict(mykey=1)
>>> myvalue = mydict['mykey']
>>> mydict['mykey'] = 2 # Here we update the "mykey" key of `mydict`.
>>> myvalue = 3 # Here we assign a new value to `myvalue` (no effect on `mydict`)
>>> mydict # Notice the `myvalue` assignment above did not affect `mydict`
{'mykey': 2}
...