2016-01-05 112 views
14

我有一些模塊可以擴展Odoo的附加組件。例如,在my_module車型,其擴大CRMOdoo。遷移

class Lead(models.Model): 
    _inherit = 'crm.lead' 
    # exmaple fields 
    field_1 = fields.Char(...) 
    field_2 = fields.Many2one(...) 
    # ... field 99 


class Stage(models.Model): 
    _inherit = 'crm.stage' 
    # exmaple fields 
    field_1 = fields.Char(...) 
    field_2 = fields.Many2one(...) 
    # ... field 99 

同樣的情況是其擴大小時,產品等 我需要做一些修改模型模塊。例如在my_module_1我需要更改幾個字段(類型,關係),在my_module_2只是爲了移除一些字段等。當然,我也需要改變每個模塊的視圖。當然,我也有我的自定義模型,它們與來自不同應用程序/模塊的模型有依賴關係。但是我有關於必須存儲的生產數據。 我在Odoo中找不到有關遷移(或模塊同步)的任何信息。

我的問題是:更新生產模塊/應用程序的最佳方式是什麼(如果我們在模型和視圖領域有很多變化)?提前致謝。

回答

0

首先,您必須轉儲生產數據庫,然後在本地系統中將其恢復。

在本地系統中恢復後,開發自定義模塊以擴展現有模型功能。

將開發的模塊安裝在本地系統(恢復的數據庫)中並查看您所做的更改。如果一切都與現有數據完美匹配,請將該模塊安裝到生產數據庫中。

要轉儲生產數據庫,請在postgres中執行以下命令。 命令:pg_dump的DBNAME> OUTFILE 例:pg_dump的prod_db> prod_db.sql

恢復數據庫之前,您必須在您的本地系統中創建新的數據庫。創建全新的數據庫執行以下命令, 命令:CREATEDB --owner OWNER_NAME --encoding UTF-8 DBNAME 實施例:CREATEDB --owner odoo --encoding UTF-8 prod_db

要恢復生產數據庫執行在postgres下面的命令。 命令:psql的DBNAME < INFILE路徑 例子:pg_dump的prod_db> prod_db.sql

+0

我對Postgres或Dump沒有任何問題。我會嘗試解釋...在生產上安裝了一些模塊。我改變了模型中的一些領域。要查看模型中的更改,需要重新啓動「openerp-server」。但服務器無法啓動,因爲表格和模型的結構不同。如果我們點擊'卸載'按鈕 - >將模型部署到服務器 - >點擊'安裝'一切都會好的,但在這種情況下我們會丟失所有數據。所以,我想知道可以創建一些**遷移腳本**並在點擊**更新模塊**或啓動服務器之前使用它們。 –

+0

你是否改變了現有字段模型中的字段數據類型或在模型中添加了新字段? –

+0

我只是在尋找一種快速簡便的方式來更新模塊。我不能相信沒有任何工具可以根據Odoo-models/tables的差異生成遷移。 –

0

也許有在Odoo 企業版遷移一些工具,但我還沒有發現這方面有任何的信息。所以我使用的解決方案是手動完成一切。一步一步,專心。如果你知道更好的方式,讓我知道。

例如。如果我們需要刪除一些字段:

  1. 從您的模塊/應用程序中的模型和視圖中刪除字段。
  2. Stop openerp-server。運行刪除我們列的sql。
  3. 將新版本模型和視圖部署到服務器。 開始openerp-server
  4. 激活開發者模式 - >進入設置 - >找到你的模塊/應用程序 - >點擊Update(升級)

如果您需要更改字段的類型/關係:

  1. 向模型中添加一個字段(使用新類型/關係)。
  2. 準備將數據從舊列傳輸到新列的sql腳本。
  3. 從模型和視圖中刪除舊字段。
  4. Stop openerp-server。運行sql腳本,刪除舊列。
  5. 將新版本模型和視圖部署到服務器。 開始openerp-server
  6. 激活開發者模式 - >進入設置 - >找到你的模塊/應用程序 - >點擊Update(升級)

要小心,當你改變關係(one2many,many2many)。製作應用程序的轉儲和版本。用db從生產中檢查本地機器上的修改幾次。

關於新領域的另一件事。例如我有module_1這取決於crmmodule_2取決於module_1等我需要一些字段添加到CRM模型,並顯示在module_1。在module_2我需要在module_1中顯示我的自定義模型中的新字段。

我們可以將所有新字段添加到模塊中的模型和視圖。停止服務器,並與參數--update這樣運行服務器:

./openerp-server --update=all 

在這種情況下,所有的模塊都將被更新。如果我們只需要更新依賴於CRM我們需要的模塊只是爲了更新CRM

./openerp-server --update=crm 
0

重新啓動命令行與-u和-d標誌 例如服務器一次。

sudo service odoo stop 
/path/to/odoo/odoo.py -d <your_db_name> -u custom_module1,custom_module2 

如果你正在處理一個生產服務器,我會用本地生產的新鮮傾倒測試,在開發機器上DB確保它正常工作,如果需要調整它(例如,一些領域可能需要默認值,不管什麼),再次在另一個新的轉儲中測試它,直到我需要做的所有事情都是重新啓動服務器,如上所述,以使更改發生。 一旦發生這種情況,請備份生產服務器上的數據庫,數據存儲區甚至受影響的模塊,上載新模塊並重新啓動生產服務器(此處不要將數據庫從測試轉儲到生產)關心數據庫的變化。

如果您試圖更改表的結構(例如更改字段數據類型)並在表中保留數據,我唯一能想到的方法是創建添加NEW字段,首先使用新數據類型填充他們與來自舊字段的數據(直接使用postgres查詢或在您的「臨時版本模塊」中),這實際上取決於變化,從選擇到many2one的變化涉及將選擇值插入到新表中,這兩個與第數據庫的角度來看,表格上的實際字段類型將是一個整數,從關係表中保存選擇值的行的ID ...

一旦您的新字段填充完畢,請將該字段的最終版本模塊將刪除所有字段不再需要(保留生產數據庫的其他版本)。

我可能會首先在開發服務器上手動測試數據庫數量,無論是在postgres中還是使用像pgadminIII這樣的工具,但是計劃在生產服務器上創建一個用於執行該腳本的腳本(或者更好地將其全部構建到新的模塊版本),因爲在發生這種情況時它將不得不關閉。

在完成所有工作後,我還會查看postgres表,即使新模塊沒有使用它們,某些字段仍可能存在。

對不起,我不知道這樣做,只是有太多變量的任何更簡單,更自動化的方式...

+0

它就像我的答案一樣,只是使用參數* -d *作爲數據庫名稱。但是,我一直在尋找簡單的方法爲「從盒子」 –

0

按你的榜樣,我相信你已經知道如何添加新的領域到現有的模型。

我還是不明白爲什麼有人會想從現有的模型刪除字段 - 這是/將是更多的麻煩比它的價值(如果有正當的理由,請讓我知道)。這也適用於重試字段類型的嘗試。有了這個說法,你可以非常容易地移除/替換/隱藏視圖上的現有字段,這本質上應該可以實現相同的結果。

https://www.odoo.com/forum/help-1/question/add-remove-fields-to-inherited-custom-module-72945

<record model="ir.ui.view" id="enter_an_id_here"> 
    <field name="name">some.text.here.form</field> 
    <field name="model">crm.lead</field> 
    <field name="inherit_id" ref="crm.external_id_here" /> 
    <field name="arch" type="xml"> 
     <field name="name" position="after"> 
      <field name="your_field_name"/> 
     </field> 
    </field> 
</record> 

您也談到了通過複製/粘貼從家屬到另一種模式遷移數據。這不是必需的,因爲您可以通過直接對象/字段引用或通過使用相關字段來訪問現有模型中的數據。

related field on odoo?

new_field = fields.Char(string='String', related='product_id.name') 
or inside python 
value = self.product_id.name 

我不會解決任何與作爲其他的答案在這裏已經解決了這些方面的安裝模塊/服務器端的命令。

+0

好創建遷移,傳輸數據等。我有10-50個自定義模塊。一些列不被使用。當然,我可以隱藏它(但我認爲這是錯誤的方式)。如何重命名,改變類型/關係等?我可以手動創建sql腳本並執行它們。關於歷史,交易呢?我應該手動停止服務器,執行腳本,更新源代碼,更新模塊並運行服務器?如果模塊升級有問題怎麼辦?這不是現代的方式。 –

+0

據我所知,您不能重命名現有模型上的字段。當你輸入一個不同的名字時,它實際上會創建一個新的字段。如果你確實重命名了一個字段,那麼它將從模型中刪除舊字段,但不從數據庫中刪除。這意味着模型將具有新的字段,並且數據庫將具有兩個字段。如果從模型刪除字段,那麼你也必須從所有視圖中刪除字段,並且還取消對其中提到已刪除的原始字段等車型的任何領域。這也可能會影響您在以後安裝的使用已刪除字段的任何模塊。 – Palza

+0

在關於腳本等 - 你可以在任何時候運行SQL腳本,您首選的時間通常取決於你正在努力完成的任務。問問你自己爲什麼要在這些腳本運行的時候想要上去或下去。 – Palza