我已经尝试了这四种更新记录的方法。书中描述了前两个。第三个看上去与第二个相同,但是不起作用。第四个看起来与第一个相同。但这也不起作用。我想念的这里有什么区别?
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')
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__
对象的Row
魔术方法,这导致数据库更新,而不是向DeckId
表对象添加了db.Deck
键。但是,在这一行:
rec = dict(CardCriteria='This works too')
您只是将rec
变量重新分配为字典(由于未使用__setitem__
语法,因此没有触发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}