web2py检查是否存在于db insert或update中

时间:2014-02-03 07:40:46

标签: mysql insert web2py

我正在尝试执行检查,以便在插入记录之前查看记录是否存在,这样我就不会收到错误。 如果它存在,我将更新一个字段。

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')

2 个答案:

答案 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

相关问题