为什么更新使用 db.table[id] 语法检索的记录不起作用?
Why does updating a record retrieved using the db.table[id] syntax not work?
这四种更新记录的方法我都试过了。书中描述了前两个。第三个看起来和第二个一样,但它不起作用。第四个看起来和第一个一样。但它也不起作用。我遗漏了哪些区别?
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]
的赋值会触发 Row
对象的 __setitem__
魔术方法,这会导致数据库更新而不是 DeckId
键添加到 db.Deck
table 对象。但是,在这一行中:
rec = dict(CardCriteria='This DOESNT work')
您只是将 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}
这四种更新记录的方法我都试过了。书中描述了前两个。第三个看起来和第二个一样,但它不起作用。第四个看起来和第一个一样。但它也不起作用。我遗漏了哪些区别?
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]
的赋值会触发 Row
对象的 __setitem__
魔术方法,这会导致数据库更新而不是 DeckId
键添加到 db.Deck
table 对象。但是,在这一行中:
rec = dict(CardCriteria='This DOESNT work')
您只是将 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}