为什么不更新使用db.table [id]语法检索的记录?

问题描述 投票:0回答:1

我已经尝试了这四种更新记录的方法。书中描述了前两个。第三个看上去与第二个相同,但是不起作用。第四个看起来与第一个相同。但这也不起作用。我想念的这里有什么区别?

    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')
web2py
1个回答
0
投票

使用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}
© www.soinside.com 2019 - 2024. All rights reserved.