методы вставки web2py - PullRequest
       5

методы вставки web2py

6 голосов
/ 01 февраля 2012

Документы Web2py имеют два метода для вставки в базу данных

db.tbl[0] = newRow

и

db.tbl.insert(newRowAsDict)

Документация подразумевает, что они являются синонимами, но они кажутся разными.Например, метод insert генерирует исключение, если newRow содержит поля, которых нет в таблице.Также метод .insert возвращает идентификатор добавленной строки, где присвоение не выполняется.

  • Является ли это предполагаемым поведением
  • Как получить идентификатор, если я используюметод присвоения?
  • Является ли метод присвоения ограниченным?

Ответы [ 3 ]

5 голосов
/ 02 февраля 2012

Существует также

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

, который отфильтрует ключи в newRowAsDict, игнорируя неизвестные поля.

2 голосов
/ 02 февраля 2012
  • Является ли это предполагаемым поведением

На основании кода это выглядит так.Используя метод присваивания, поля фильтруются, поэтому он пытается только вставить поля, принадлежащие таблице.Этого не происходит со стандартным методом insert().

  • Как получить идентификатор, если я использую метод назначения?

Есливам нужен идентификатор, вам, вероятно, лучше использовать метод insert().

  • Является ли метод назначения недопустимым?

Не знаюне думаю.

1 голос
/ 07 февраля 2012

Небольшое исследование показывает разницу между ними:

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

...