2012-02-01 11 views
6

docs Web2py tienen dos métodos para insertar en una base de datosmétodos de inserción web2py

db.tbl[0] = newRow 

y

db.tbl.insert(newRowAsDict) 

de la documentación, que son sinónimos, pero parecen ser diferentes. Por un lado, el método insert arroja una excepción si newRow contiene campos que no están en la tabla. Además, el método .insert devuelve la identificación de la fila agregada, donde la asignación no.

  • es éste el comportamiento previsto
  • ¿Cómo puedo obtener el id si uso el método de asignación?
  • ¿El método de asignación está privado?

Respuesta

1

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.

2
  • es éste el comportamiento previsto

Basado en el código, que parece ser. Con el método de asignación, los campos se filtran, por lo que solo intenta insertar los campos que pertenecen a la tabla. Esto no ocurre con el método estándar insert().

  • ¿Cómo puedo obtener el id si uso el método de asignación?

Si necesita el id, es probable que mejor usar el método insert().

  • ¿El método de asignación está privado?

No lo creo así.

4

Existe también

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

que filtrará las llaves en newRowAsDict ignorando campos desconocidos.

Cuestiones relacionadas