web2py插入方法

6

Web2py文档有两种向数据库插入数据的方法

db.tbl[0] = newRow

and

db.tbl.insert(newRowAsDict)

文档似乎暗示它们是同义词,但它们看起来不同。首先,如果 newRow 包含表中不存在的字段,则 insert 方法会抛出异常。此外,.insert 方法返回添加行的 id,而赋值方法则不返回。

  • 这是预期的行为吗?
  • 如果我使用赋值方法,如何获取id?
  • 赋值方法已经过时了吗?
3个回答

5

还有其他的

db.tbl.insert(**db.tbl._filter_fields(newRowAsDict))

该函数将过滤掉newRowAsDict中未知的字段。


2
基于代码,这似乎是预期的行为。使用赋值方法,字段被过滤,因此仅尝试插入属于表的字段。标准的insert()方法不会发生这种情况。
如果需要id,则最好使用insert()方法。
我不认为赋值方法已被弃用。

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]非常有用,用于更新的情况下具备完全相同的符号表示,这可以帮助简化代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接