Un poco de sondeo muestra la diferencia entre los dos:
Por: 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))
Por: 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))
Ambos terminan llamando el mismo código para hacer la inserción, por lo que verá que ejecutan la misma consulta:
INSERT INTO tbl(name) VALUES ('something');
Dado que el primero tiene _filter_fields
, como se desprende de la traza, no arroja una excepción cuando hay campos que no están presentes en la tabla, mientras que el otro sí.
Obviamente, db.tbl[0] = newRow
no puede devolver un valor. Debería considerarlo como una abreviatura de inserción y su primo db.tbl[x>0]
es extremadamente útil para las actualizaciones y tiene exactamente la misma notación, lo que ayuda a simplificar el código.