Trochę sondowania pokazuje różnicę między tymi dwoma:
Dla: 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))
dla: 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))
Oba z nich kończy się wywołaniem samego kodu zrób wstawkę, aby zobaczyć, że uruchamiają to samo zapytanie:
INSERT INTO tbl(name) VALUES ('something');
Ponieważ pierwsza z nich ma postać _filter_fields
, jak wynika z śledzenia, nie generuje wyjątku, gdy istnieją pola, które nie występują w tabeli, a drugie nie.
Oczywiście, db.tbl[0] = newRow
nie może zwrócić wartości. Powinieneś po prostu uznać to skrótowo za wstawkę, a jego kuzyn db.tbl[x>0]
jest niezwykle przydatny w przypadku aktualizacji i ma dokładnie taki sam zapis, co pomaga uprościć kod.