Использование 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}