Небольшое исследование показывает разницу между ними:
Для: 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]
чрезвычайно полезен для обновлений и имеет точно такую же запись, что помогает упростить код.