为什么更新使用 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}