2012-02-01 12 views
6

Web2py docs mają dwa sposoby wstawiania do bazy danychWeb2py metody insert

db.tbl[0] = newRow 

i

db.tbl.insert(newRowAsDict) 

Dokumentacja wskazuje, że są one synonimami, ale wydają się być inna. Po pierwsze, metoda wstawiania zgłasza wyjątek, jeśli newRow zawiera pola, których nie ma w tabeli. Również metoda .insert zwraca identyfikator dodanego wiersza, w którym to przypisanie nie występuje.

  • Czy to zamierzone zachowanie
  • W jaki sposób można uzyskać identyfikator, jeśli mogę użyć metody przydziału?
  • Czy metoda przypisania jest zdywersyfikowana?

Odpowiedz

1

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.

2
  • Jest to zamierzone zachowanie

podstawie kodu wydaje się być. Korzystając z metody przypisania, pola są filtrowane, więc próbuje tylko wstawić pola należące do tabeli. Nie dzieje się tak ze standardową metodą insert().

  • W jaki sposób można uzyskać identyfikator, jeśli mogę użyć metody przydziału?

Jeśli potrzebujesz id, jesteś prawdopodobnie lepiej wyłączyć za pomocą metody insert().

  • Czy metoda przypisania jest zdywersyfikowana?

Nie sądzę.

4

Istnieje również

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

które będą filtrować klucze w newRowAsDict ignorując nieznanych pól.