如何导入数据到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

这个方法使数据导入变得更加快捷,而且如果在导入过程中系统崩溃,当再次重启服务器时它会从上次已导入的最后一行数据继续。这使得我们导入大文件的数据时更加容易。

根据wikipedia上的定义,ETL,是英文 Extract-Transform-Load 的缩写,用来描述将资料从来源端经过萃取(extract)、转置(transform)、加载(load)至目的端的过程。ETL一词较常用在资料仓储,但其对象并不限于资料仓储Powered by Hackadelic Sliding Notes 1.6.5
目前社区中已经有一个使用Kettle作为ETL工具的项目,请参看:https://code.launchpad.net/openerp-kettlePowered by Hackadelic Sliding Notes 1.6.5

Leave a Response