[英]web2py insert methods
Web2py文檔有兩種插入數據庫的方法
db.tbl[0] = newRow
和
db.tbl.insert(newRowAsDict)
文檔暗示它們是同義詞,但它們似乎是不同的。 例如,如果newRow包含不在表中的字段,則insert方法拋出異常。 此外,.insert方法返回添加行的id,而賦值則不返回。
還有
db.tbl.insert(**db.tbl._filter_fields(newRowAsDict))
這將過濾newRowAsDict中的鍵,忽略未知字段。
- 這是預期的行為嗎?
基於代碼,它似乎是。 使用賦值方法,字段將被過濾,因此它只會嘗試插入屬於該表的字段。 標准的insert()
方法不會發生這種情況。
- 如果使用賦值方法,如何獲取id?
如果你需要id,你可能最好使用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]
對更新非常有用,並且具有完全相同的表示法,這有助於簡化代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.