web2py的文檔有插入到數據庫中的兩個方法web2py的插入方法
db.tbl[0] = newRow
和
db.tbl.insert(newRowAsDict)
的文檔意味着他們是同義詞,但他們似乎是不同的。首先,如果newRow包含不在表中的字段,則插入方法會引發異常。 .insert方法還會返回添加的行的標識,其中分配不是。
- 這是預期的行爲
- 我怎樣才能獲得ID,如果我使用分配方法?
- 賦值方法是否被刪除?
web2py的文檔有插入到數據庫中的兩個方法web2py的插入方法
db.tbl[0] = newRow
和
db.tbl.insert(newRowAsDict)
的文檔意味着他們是同義詞,但他們似乎是不同的。首先,如果newRow包含不在表中的字段,則插入方法會引發異常。 .insert方法還會返回添加的行的標識,其中分配不是。
的探測一點點示出了兩者之間的差別:對於
: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]
對於更新非常有用,並且具有完全相同的記法,這有助於簡化代碼。
- 這是預期的行爲
基於代碼,這似乎是。使用賦值方法,字段被過濾,所以它只試圖插入屬於表的字段。標準insert()
方法不會發生這種情況。
- 如何使用賦值方法獲得id?
如果你需要的ID,你可能最好使用insert()
方法。
- 該賦值方法是否被刪除?
我不這麼認爲。
還有
db.tbl.insert(**db.tbl._filter_fields(newRowAsDict))
將過濾器newRowAsDict忽略未知領域的關鍵。