2012-02-01 46 views
6

web2py的文檔有插入到數據庫中的兩個方法web2py的插入方法

db.tbl[0] = newRow 

db.tbl.insert(newRowAsDict) 

的文檔意味着他們是同義詞,但他們似乎是不同的。首先,如果newRow包含不在表中的字段,則插入方法會引發異常。 .insert方法還會返回添加的行的標識,其中分配不是。

  • 這是預期的行爲
  • 我怎樣才能獲得ID,如果我使用分配方法?
  • 賦值方法是否被刪除?

回答

1

的探測一點點示出了兩者之間的差別:對於

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]對於更新非常有用,並且具有完全相同的記法,這有助於簡化代碼。

2
  • 這是預期的行爲

基於代碼,這似乎是。使用賦值方法,字段被過濾,所以它只試圖插入屬於表的字段。標準insert()方法不會發生這種情況。

  • 如何使用賦值方法獲得id?

如果你需要的ID,你可能最好使用insert()方法。

  • 該賦值方法是否被刪除?

我不這麼認爲。

4

還有

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

將過濾器newRowAsDict忽略未知領域的關鍵。