web2py 插入方法
Web2py的文档中有两种方法可以用来往数据库里插入数据
db.tbl[0] = newRow
和
db.tbl.insert(newRowAsDict)
文档中暗示这两种方法是一样的,但它们实际上似乎有些不同。首先,insert方法如果新行包含了表中没有的字段,就会抛出一个异常。另外,.insert方法会返回新添加行的ID,而赋值方法则不会。
- 这是预期的行为吗?
- 如果我使用赋值方法,怎么才能获取ID呢?
- 赋值方法是被淘汰了吗?
3 个回答
2
- 这是预期的行为吗?
根据代码来看,似乎是这样的。使用赋值方法时,字段会被过滤,只会尝试插入属于这个表的字段。而标准的 insert()
方法就没有这个过滤。
- 如果我使用赋值方法,怎么才能获取到id?
如果你需要id,使用 insert()
方法可能会更好。
- 赋值方法被弃用了吗?
我觉得没有。
5
还有一个
db.tbl.insert(**db.tbl._filter_fields(newRowAsDict))
它会过滤掉新行中的键,忽略那些未知的字段。
1
稍微探讨一下,就能看出这两者之间的区别:
第一种写法:db.tbl[0] = dict(name='something')
File "/var/web2py/gluon/globals.py", line 172, in <lambda>
self._caller = lambda f: f()
File "/var/web2py/applications/myapp/controllers/default.py", line 114, in test
db.tbl[0] = dict(name='something')
File "/var/web2py/gluon/dal.py", line 5531, in __setitem__
self.insert(**self._filter_fields(value))
File "/var/web2py/gluon/dal.py", line 5605, in insert
return self._db._adapter.insert(self,self._listify(fields))
第二种写法:db.tbl.insert(name='something')
File "/var/web2py/gluon/globals.py", line 172, in <lambda>
self._caller = lambda f: f()
File "/var/web2py/applications/myapp/controllers/default.py", line 115, in test
db.tbl.insert(name='something')
File "/var/web2py/gluon/dal.py", line 5605, in insert
return self._db._adapter.insert(self,self._listify(fields))
这两种写法最终都会调用同一段代码来进行插入操作,所以你会发现它们执行的是同一个查询:
INSERT INTO tbl(name) VALUES ('something');
因为第一种写法会执行_filter_fields
,从追踪记录中可以看出,当表中没有某些字段时,它不会抛出异常,而第二种写法则会。
显然,db.tbl[0] = newRow
不能返回一个值。你可以把它看作是插入操作的一种简写,而它的兄弟写法db.tbl[x>0]
对于更新操作非常有用,语法完全相同,这样可以简化代码。