2013-11-26 30 views
2

我一直在嘗試通過Python學習開放ERP模塊開發。我想出了一個我認爲我不瞭解的源代碼。我瀏覽網頁時嘗試過幾個鏈接,但無法找到有用的鏈接。我需要很好地理解這一點。cr.execute在OpenERP開發中意味着什麼?

cr.execute(""" 
      SELECT a.id as id, COALESCE(MAX(l.date),a.purchase_date) AS date 
      FROM account_asset_asset a 
      LEFT JOIN account_move_line l ON (l.asset_id = a.id) 
      WHERE a.id IN %s 
      GROUP BY a.id, a.purchase_date """, (tuple(ids),)) 
     return dict(cr.fetchall()) 

請回復, 的希望建議, 最良好的祝願,感謝 。

+2

這肯定是它正在運行的SQL代碼。所以'cr'大概是一個數據庫遊標對象。有關更多詳細信息,您需要檢查光標在代碼的其他部分中的創建位置。但是,您可以閱讀關於Python數據庫模塊通常在[PEP 249](http://www.python.org/dev/peps/pep-0249/)中使用的通用API。 – Blckknght

+0

我知道它的一個數據庫光標,但我沒有得到它的工作方式 –

+0

我懷疑你需要解釋更多關於代碼和你不明白,然後得到答案。例如,這個代碼在哪裏運行?你對此有何瞭解(例如,你知道'account_asset_asset'和'account_move_line'表是用於什麼)? – Blckknght

回答

2

正如你所理解的,cr是一個數據庫遊標。它允許您直接在數據庫上執行SQL查詢並獲取結果。

它的工作方式是沒有什麼特別的:

執行的SQL代碼:

cr.execte("some sql code") 

Retreive結果:

cr.fetchone() 
cr.fetchall() 
etc. 

或者遍歷光標(它的迭代):

for rec in cr: 
    print(rec) 

有關光標的詳細信息對象,你可能想看看在Psycopg documentation

在OpenERP的Cr的對象是在OSV/ORM代碼某處初始化,並在模型中提供您創建的子類osv.osv的。

現在我很傷心,我必須注意到,通常情況下,您不希望在OpenERP中使用直接的SQL查詢。 OpenERP爲您提供完整的對象關係模型(orm)作爲數據庫層的抽象。例如,如果你想要的地方訪問account_asset_asset模型在你的代碼,你應該使用ORM喜歡「天然」的OpenERP的方法:

asset_obj = self.pool.get('account.asset.asset') 
asset_ids = asset_obj.search(cr, uid, [('date', '>', start_date), ('date', '<', end_date)]) 
assets = asset_obj.browse(cr, uid, asset_ids, context=your_context) 
for asset in assets: 
    print asset 

保持CR功能對於一些特殊情況下的「天然」的方法將是爲了追求。

3

只是想在這裏加點分,所以我覺得它需要單獨回答:

  • 鉻(光標)不是psycopg2光標,它是一個包含psycopg2光標的OpenERP的類。它一般通過大多數方法調用,通過對封裝Psyco的光標,但它確實實現了幾個它自己的,如接近,執行等。在OpenERP的7看看在sql_db.py

  • 要糾正安德烈的例子中,OpenERP的光標不迭代,如果您嘗試遍歷它,你將看到:

    for row in cr: 
    TypeError: 'Cursor' object is not iterable 
    

    有一天,我會避開這個提高的錯誤。

  • 將fetchone和fetchall方法傳遞給底層的pscyo遊標,以便閱讀那些標準文檔。

  • 對於一般用途,如果你做了一個cr.execute,結果集只有存在,直到你做了其他的事情,比如ORM寫入等。

  • cr.execute通常只用於特殊情況,或者運行復雜的SQL連接等。它應該只是一個度假勝地,你確信ORM不會及時做你想做的。

  • 千萬不要試圖自己管理提供的cr對象上的事務。如果您需要這樣做以防止像隔夜計算更新那樣的長時間運行事務,請創建並管理您自己的光標。舉一個例子來看看認證採購模塊。

  • 在開始組裝查詢之前,請確保您瞭解什麼是SQL注入以及使用查詢參數的正確方法(請查看psycopg2中游標類的文檔)。