在開發過程中,遇見需要將SQL Server中的數據轉移到Pg數據庫的情況,那么如何做才能解決這一問題呢?
1.自己寫代碼,將數據從SQL Server到PG。
2.利用odoo自帶的導入功能導入。
出於時間緊張和熟悉odoo功能的原因,目前選取第二種解決方案,下面記錄具體的操作過程。
具體場景是主從兩張表,主表是
class EnglishLexicon(models.Model): _name = 'english.lexicon' _description = 'english lexicon' word = fields.Char(string="Word", required=True, index=True) lexicon_explain_ids = fields.One2many('english.lexicon.explain', 'english_lexicon_id', "Detail") america_accent = fields.Char(string="America Accent") british_accent = fields.Char(string="British Accent") chinese_mean = fields.Text(string="Chinese Mean") america_voice_url = fields.Char(string="America URL") british_voice_url = fields.Char(string="British URL") source_name = fields.Char(string="From") sequence = fields.Integer() is_updated = fields.Boolean(string="Is Updated", default=False)
從表是
class EnglishLexiconExplain(models.Model): _name = 'english.lexicon.explain' _description = 'english lexicon explain' english_lexicon_id = fields.Many2one('english.lexicon', 'EnglishLexicon', ondelete='cascade', required=True) order = fields.Integer() raw_html_mean = fields.Text(string="Html Mean") gram = fields.Char(string="Gram") english_mean = fields.Text(string="Processed Mean") chinese_mean = fields.Text(string="Chinese Mean") is_format = fields.Boolean(string="Is Format", default=False)
這里的難點是從表涉及到外鍵的問題。
1.從SQL Server導出數據
主表數據sql語句
--表頭 select '__export__.english_lexicon_'+Convert(nvarchar,id)+'_1' id, World word, AmericaAccent america_accent, BrithAccent british_accent, ChineseMean chinese_mean, AmericaVoiceUrl america_voice_url, BrithVoiceUrl british_voice_url, SourceName source_name, Sequence sequence, 'False' is_updated from dbo.KS_EnglishLexicon order by id,Sequence
注意這里的id字段,這里不再是單純的int類型的字段,而是'__export__.english_lexicon_'+id+'_1'的格式,即__export__.{odoo Model類名稱}_{id序列號}_1。
其他字段和類的字段名稱相同即可。
將查詢出來的數據放入到Excel中
從表sql語句
--表體 select '__export__.english_lexicon_explain_'+Convert(nvarchar,id)+'_1' id, '__export__.english_lexicon_'+Convert(nvarchar,KS_EnglishLexiconId)+'_1' 'english_lexicon_id/id', [Order] [order], RawHtmlWorld raw_html_mean, Gram gram, EnglishMean english_mean, ChinsesMean chinese_mean, 'False' is_format from dbo.KS_EnglishLexiconExplain order by KS_EnglishLexiconId,[Order]
這里需要注意的有兩點,第一點是id字段,基本和主表的格式一樣,只是最后再加一個'_1',寫死的,好像不加也可以。即'__export__.{odoo Model從表類名稱}_{序列號}_1'。
第二點就是外鍵的問題,這個基本上是我們處理問題的核心處,命名的格式是{odoo主表對應的類名稱}_id/id,我們的主表名為english_lexicon,所以結果是english_lexicon_id/id;
內容格式是'__export__.{odoo Model主表表類名稱}_{序列號}_1',這里是主表,即表示外鍵,結果是__export__.english_lexicon_具體id值_1.
其他字段頭內容和從表的字段名稱一致即可。
2.將Excel數據導入到odoo系統中
首先是主表導入,這里的id字段與External ID相對應,這個是關鍵點,其他字段依次相對應即可
然后我們點擊 Test Import按鈕,檢查是否有數據錯誤。
Loading結束之后,如果沒錯的話,就是以下情況
這樣我們就可以放心的點 Import按鈕將數據導入到我們的系統中去了。
從表的導入
這里像主表一樣,id字段與External ID字段對應,外鍵english_lexicon_id/id與EnglishLexicon/External ID相對應,其他字段對應即可。
像主表一樣測試導入 然后再導入,如果沒問題,基本上數據導入成功,並且建立了主從關系。
以上數據格式的確定是自己根據odoo導出數據之后進行分析的結果,這里以從表從odoo導出的數據為例
"id","english_lexicon_id/id","chinese_mean","is_format" "__export__.english_lexicon_explain_1_1","__export__.english_lexicon_1_1","","False"
我們看到,不管是主鍵id還是外鍵,都是__export__.{表名稱}_{序列號}_1的格式,所以才有了之前的格式要求。
此方法導入數據方便倒是挺方便的,只是需要每個類都要單獨的在左側菜單欄里調用出來,第二個從表的導入模塊是后來特意增加的。其實主表模塊在導入的時候有從表字段的選擇,是否可以主表從表數據可以整理到一個數據文件中,一塊將數據導入呢?有待進一步測試。