odoo數據庫 導入、導出
首先odoo框架下postgresql數據庫中,表結構的存儲方式:
存在id(小寫),並沒有所謂的外部ID
例如數據庫中的國家表:模塊名_tb_country (注意:odoo框架下,數據庫中生成的表命名規則是,模塊名_實際表名)
id code name
1 001 中國
2 002 美國
3 003 德國
。。。
odoo系統自帶功能,前台界面導出的時候:導入兼容導出模式
這種情況下導出的csv表數據結構 : 注意這里導出的id為小寫
id code name
__export__.模塊名_tb_country_1 001 中國
__export__.模塊名_tb_country_2 002 美國
__export__.模塊名_tb_country_3 003 德國
我們再對比看下 另一種導出模式:導出全部數據
這種情況下導出的csv數據結構 :如果選擇導出id,那么導出的CSV表中,外部id字段的表頭,會和ID做個區分,改成了External ID
External ID ID code name
__export__.模塊名_tb_country_1 1 001 中國
__export__.模塊名_tb_country_2 2 002 美國
__export__.模塊名_tb_country_3 3 003 德國
我們可以看到 兩種方式導出的.CSV表結構可能有些區別,那么我們如果從外部導入原始數據的時候,應該怎么導入呢,官方建議是按照odoo的機制,最好導入外部id;
可以參考文檔:
https://www.odoo.com/documentation/user/11.0/general/base_import/import_faq.html
http://www.sunpop.cn/documentation/user/10.0/zh_CN/general/base_import/import_faq.html
那我們導入數據的時候,具體應該按照哪種格式,制作CSV源表,
建議:比如我們在一個新odoo環境下,要導入國家表,那么可以按照如下格式:
方式1:
ID code name
模塊名_tb_country_1 001 中國
模塊名_tb_country_2 002 美國
模塊名_tb_country_3 003 德國
方式2:
ID code name
__export__.模塊名_tb_country_1 001 中國
__export__.模塊名_tb_country_2 002 美國
__export__.模塊名_tb_country_3 003 德國
方式3:
ID code name
tb_country_1 001 中國
tb_country_2 002 美國
tb_country_3 003 德國
兩種方式都可以,方式1, 2加了__export__.前綴,系統也是正常識別的,不會報錯,只是ID不會從1開始。(注:這里寫錯了 ,其實ID 不從1開始,是因為導入數據的時候,不能點擊驗證,否則id就不是從1開始了!!!)
建議以方式3導入,注意導入的時候ID字段的ID 要大寫,不是小寫。
補充知識:
postgresql 中表的字段,id字段,為整形自增字段,並且插入一條數據之后,該id是從1開始,而不是從0開始。
用truncate命令清空表之后,id字段並不會清空變成1,還是會繼續歷史數據id往后自增。
這里需要注意一下,
1.如果truncate命令執行的時候,提示有相關的表存在引用,執行的時候,可以加上cascade參數,具體語法:
TRUNCATE TABLE 表1,表2,表3...... cascade
表和表之間用 逗號分隔;
https://stackoverflow.com/questions/2679854/postgresql-disabling-constraints
https://www.yiibai.com/html/postgresql/2013/080676.html
2. 如果我們確實有,把id字段重置的需求,那么可以用以下方式:(注意,此方式還原id序列,並不會將數據清空,用了該方法之后,如果原表中數據沒有被清空,往原表里插入數據是會報id已存在的錯誤的,所以該命令要配合truncete使用。)
ALTER SEQUENCE 表名_id_seq RESTART WITH 1
表名_id_seq查看獲取方式:
項目中需要清空postgresql數據庫中的一些表的數據,並將主鍵自增字段設置為1,在使用truncate在清表的時候,不能將主鍵自增字段重置為1,所以嘗試采用下面這種方面進行重置自增的主鍵字段: ALTER SEQUENCE tab_seq RESTART WITH 1; 其中,tab_seq為表的序列標識(使用pgAdmin III軟件序列標識位於數據庫/數據庫名/模式/序列/查找需要重置的序列)