Web2py文档有两种向数据库插入数据的方法
db.tbl[0] = newRow
and
db.tbl.insert(newRowAsDict)
文档似乎暗示它们是同义词,但它们看起来不同。首先,如果 newRow 包含表中不存在的字段,则 insert 方法会抛出异常。此外,.insert 方法返回添加行的 id,而赋值方法则不返回。
- 这是预期的行为吗?
- 如果我使用赋值方法,如何获取id?
- 赋值方法已经过时了吗?
还有其他的
db.tbl.insert(**db.tbl._filter_fields(newRowAsDict))
该函数将过滤掉newRowAsDict中未知的字段。
insert()
方法不会发生这种情况。insert()
方法。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]
非常有用,用于更新的情况下具备完全相同的符号表示,这可以帮助简化代码。