簡體   English   中英

web2py插入方法

[英]web2py insert methods

Web2py文檔有兩種插入數據庫的方法

db.tbl[0] = newRow

db.tbl.insert(newRowAsDict)

文檔暗示它們是同義詞,但它們似乎是不同的。 例如,如果newRow包含不在表中的字段,則insert方法拋出異常。 此外,.insert方法返回添加行的id,而賦值則不返回。

  • 這是預期的行為嗎?
  • 如果使用賦值方法,如何獲取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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM