在开发过程中,遇见需要将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的格式,所以才有了之前的格式要求。
此方法导入数据方便倒是挺方便的,只是需要每个类都要单独的在左侧菜单栏里调用出来,第二个从表的导入模块是后来特意增加的。其实主表模块在导入的时候有从表字段的选择,是否可以主表从表数据可以整理到一个数据文件中,一块将数据导入呢?有待进一步测试。