我正在尝试执行检查,以便在插入记录之前查看记录是否存在,这样我就不会收到错误。 如果它存在,我将更新一个字段。
mydb(mydb.myitems.itemNumber==int(row)).update(oldImageName=fileName) or
mydb.myitems.insert(itemNumber=int(row),oldImageName=fileName)
如果我尝试更新不存在的记录,那么它应该从0开始抛出1或者其他东西。但是在上面的情况下,它总是抛出0,所以插入会继续发生。
为什么?
谢谢!
更新: 添加模型:
mydb.define_table('myitems',
Field('itemNumber', 'id',notnull=True,unique=True),
Field('oldImageName', 'string')
答案 0 :(得分:7)
如果我尝试更新不存在的记录,那么它应该从0开始抛出1或者其他东西。
如果您尝试更新不的记录,.update()
将返回None
,因此插入将会发生。如果存在匹配记录,.update()
将返回更新的记录数。
无论如何,你应该这样做:
mydb.myitems.update_or_insert(mydb.myitems.itemNumber == int(row),
oldImageName=filename)
或者:
mydb.myitems.update_or_insert(dict(itemNumber == int(row)),
oldImageName=filename)
update_or_insert
的第一个参数是_key
,它可以是DAL查询,也可以是字段名称作为键的字典。
答案 1 :(得分:1)
这基本上是对安东尼答案的修正,当我尝试时,这个答案没有得到很好的结果。如果你这样做:
mydb.myitems.update_or_insert(mydb.myitems.itemNumber == int(row),
itemNumber = int(row),
oldImageName=filename)
然后代码应该插入带有itemNumber和filename的记录,如果那里没有那个带有该号码的项目,否则更新它。
如果你错过了itemNumber = int(row),那么web2py构成了一个可能不是想要的itemNumber。
请参阅http://www.web2py.com/books/default/chapter/29/06/the-database-abstraction-layer#update_or_insert