odoo開發筆記 -- odoo和postgresql數據庫導入相關


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軟件序列標識位於數據庫/數據庫名/模式/序列/查找需要重置的序列)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM