web2py 插入方法

6 投票
3 回答
4967 浏览
提问于 2025-04-17 12:08

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] 对于更新操作非常有用,语法完全相同,这样可以简化代码。

撰写回答