如何导入数据到Open ERP
原文作者:Fabien Pinckaers
中文翻译:Tony Gu(digitalsatori)
导入数据到Open ERP有很多种方法:
- 通过webservice界面
- 在客户端界面使用CSV文件
- 创建以.XML文件或.CSV文件为内容的模块
- 使用一个ETL工具将数据直接导入SQL数据库
Open Object's ETL
在下一版本的Open Object中将包含一个完整的ETL系统,它可以很容易的将其它应用程序中的数据萃取,转置,并加载到Open ERP中。该项目预计在三个月后发布。如果你有兴趣帮助这个项目,你可以在launchpad的以下位置下载:
bzr branch lp:~openerp-commiter/openobject-addons/trunk-extra-addons/ directory: etl
Open ERP导入数据的最佳方法
导入数据到Open ERP的最佳方法是创建一个集成所需导入数据的模块。因此,当需要导入数据时,你只要安装这个模块,Open ERP会自动处理数据的导入过程。当有许多不同类型的数据需要导入时,我们一般会创建几个不同的模块。
现在我们就来介绍如何创建这样的模块。首先,在addons目录下创建一个称为data_yourcompany的目录作为我们要创建的模块。
mkdir data_yourcompany cd data_yourcompany touch __init__.py
您还需要创建一个文件__terp__.py,其中包括以下模块的描述信息。
{ 'name': 'Module for Data Importation', 'version': '1.0', 'category': 'Generic Modules/Others', 'description': "Sample module for data importation.", 'author': 'Tiny', 'website': 'http://www.openerp.com', 'depends': ['base'], 'init_xml': [ 'res.partner.csv', 'res.partner.address.csv' ], 'update_xml': [], 'installable': True, 'active': False, }
在init_xml单元,我们定义了res.partner.csv和res.partner.address.csv这两个文件:
- res.partner.csv : 包含res.partner对象的记录的CSV文件
- res.partner.address.csv : 包含res.partner.address对象的记录的CSV文件
该模块创建后,我们可以将老系统中的数据导出到.CSV文件,然后模块就可以将该.CSV文件中的数据导入OpenERP。OpenERP中的内在机制能自动识别这些.CSV中的数据字段。
假设我们要从另一个称为old的OpenERP账套数据库中导出数据。这里我们可以使用postgresql的命令行客户端:psql来执行数据的导出任务。要想获得.CSV文件的格式,我们使用以下的psql命令行参数:
- -A : 不用空格分割行记录
- -F , : 设置字段分割符为','
- --pset footer : 不在最后一行输出类似 "(21 rows)"这样的数据
在稍后我们将.CSV 文件导入Open ERP时,‘id'字段的数字或字符串必须保持唯一,这样就不会与Open ERP中的已有记录发生冲突。而对于many2one字段需要引用这些记录时,可以使用'字段名:id’。Open ERP会根据这些唯一的ID重建记录间的关系。
导出partner的psql命令行:
psql old -c "select 'partner_'||id as id,name from res_partner" -A -F , --pset footer > res.partner.csv
这样创建的res.partner.csv 文件的结构如下:
id,name partner_2,ASUStek partner_3,Agrolait partner_4,Camptocamp partner_5,Syleam
这样我们就从res.partner对象生成了所需数据,并且给来自系统中的ID加了前缀以保持其在新的系统中的唯一性。
接下来,我们来导出address(或联系人)表中的数据,该表与partner表通过字段:partner_id关联。我们用类似的方法导出数据,并将其放在我们创建的模块中:
psql old -c "select 'partner_address'||id as id,name,'partner_'||partner_id as \"partner_id:id\" from res_partner_address" -A -F , --pset footer > res.partner_address.csv
这样创建的res.partner_address.csv 文件的结构如下:
id,name,partner_id:id
partner_address2,Benoit Mortier,partner_2
partner_address3,Laurent Jacot,partner_3
partner_address4,Laith Jubair,partner_4
partner_address5,Fabien Pinckaers,partner_4
当安装这个模块时,Open ERP会自动导入partners和address的数据并有效的重建他们之间的联接关系。在模块安装过程中,Open ERRP会测试并应用数据一致性校验,所以有些时候安装会失败。比如,在导入的数据中如果不同partner有相同的“名称‘,因为partner的“名称“要求唯一,这时模块安装就会失败。所以在导入数据之前,有必要先清理以下数据。
如果你打算通过这个方法导入大量的记录,请在运行Open ERP服务器时使用‘-P‘命令行选项:
openerp_server.py -P status.pickle --init=data_yourcompany
这个方法使数据导入变得更加快捷,而且如果在导入过程中系统崩溃,当再次重启服务器时它会从上次已导入的最后一行数据继续。这使得我们导入大文件的数据时更加容易。













