2017-02-13 43 views
1

我不明白在版本9中使用遊標!你需要光標嗎?在odoo中使用光標9

在下面的例子中後控制檯線路通話功能得到:

<openerp.sql_db.Cursor object at 0x7f94f4c0b0d0> 



@api.multi 
    def my_func(self): 
     cursor = self.env.cr 
     print(cursor) 

任何簡單的例子時,爲什麼使用遊標?

回答

4

基本上游標對象是Odoo用來與postgresql數據庫通信的接口。

在Odoo中,您通常不需要直接與它進行交互,但有時您會遇到Odoo ORM只是不給您想要的結果的情況。這是你需要使用數據庫遊標的時候。對於使用ORM無法實現的sql查詢。

您也可以使用數據庫遊標來克服安全限制,儘管有人會說這不是可取的。然而,我不會評判你。

Odoo中的遊標是數據庫遊標。它基本上是一個psycopg2數據庫遊標。我相信它已經被Odoo修改過,但是不能給你一個修改內容的具體例子。

這裏有一些簡單的例子。

@api.multi 
def sql_example(self): 
    sql = "SELECT * FROM table_name WHERE col = 'some_value'" 

上面的查詢可以任何你想要的

self.env.cr.execute(sql) 
    for record in self.env.cr.fetchall(): 
     # YOUR CODE HERE 

如果要執行UPDATE /刪除/創建函數必須提交更改。

sql = "UPDATE table_name SET col = 'some_value' WHERE col = 'some_value'" 
    self.env.cr.execute(sql) 
    self.env.cr.commit() 

有時您可能會發現緩存數據正在返回您的查詢中。你可能需要刷新這個。

self.env.invalidate_all() 

所以,如果你想更好地瞭解光標對象是你可以查看文檔

Tutorials PointPsycopg2 DocsPostgresql Docs

底線是什麼,光標是你如何查詢數據庫。您不必使用它,但是如果您發現自己需要獲取使用ORM不可用的數據,則可以使用它。

+0

非常好的描述.... Tnx人! –

+0

沒問題。樂於幫助。 –

+0

非常好的答案。 – CZoellner

1

您可以使用cr在您的函數中執行查詢。

@api.multi 
def my_func(self): 
    cursor = self.env.cr 
    cursor.execute("select * from res_partner") 
    for partner in cursor.fetchall(): 
     ...... 
     ......