如何编写使用OpenERP ORM直接上传到Postgres数据库的Python脚本

时间:2012-07-15 16:24:10

标签: openerp

我需要在Python中编写一个“独立”脚本,仅使用OpenERP的ORM模块将销售税上传到数据库中的account_tax表。我想做的是像下面的伪代码。

有人可以提供以下详细信息: 1)我需要设置什么sys.path 2)在导入“帐户”模块之前,我需要导入哪些模块。目前,当我导入“帐户”模块时,我收到以下错误: AssertionError:报告“report.custom”已经存在! 3)获取数据库光标的正确方法是什么。在下面的代码中,我只是直接调用psycopg2来获取游标。

如果这种方法不起作用,除了编写XML文件以从OpenERP应用程序本身加载数据之外,是否有人可以提出替代方法。此过程需要在标准OpenERP应用程序之外运行。

PSEUDO CODE:

import sys
# set Python paths to access openerp modules
sys.path.append("./openerp")
sys.path.append("./openerp/addons")

# import OpenERP 
import openerp

# import the account addon modules that contains the tables 
# to be populated.
import account

# define connection string
conn_string2 = "dbname='test2' user='xyz' password='password'"

# get a db connection
conn = psycopg2.connect(conn_string2)

# conn.cursor() will return a cursor object
cursor = conn.cursor()

# and finally use the ORM to insert data into table.

8 个答案:

答案 0 :(得分:17)

如果您想通过网络服务进行操作,请查看OpenERP XML-RPC Web services

使用OpenERP Web Services进行代码编写示例:

import xmlrpclib

username = 'admin' #the user
pwd = 'admin'      #the password of the user
dbname = 'test'    #the database

# OpenERP Common login Service proxy object 
sock_common = xmlrpclib.ServerProxy ('http://localhost:8069/xmlrpc/common')
uid = sock_common.login(dbname, username, pwd)

#replace localhost with the address of the server
# OpenERP Object manipulation service 
sock = xmlrpclib.ServerProxy('http://localhost:8069/xmlrpc/object')

partner = {
   'name': 'Fabien Pinckaers',
   'lang': 'fr_FR',
}
#calling remote ORM create method to create a record 
partner_id = sock.execute(dbname, uid, pwd, 'res.partner', 'create', partner)

更清楚的是,你也可以使用OpenERP Client lib 带有客户端lib的示例代码:

import openerplib

connection = openerplib.get_connection(hostname="localhost", database="test", \
    login="admin", password="admin")
user_model = connection.get_model("res.users")
ids = user_model.search([("login", "=", "admin")])
user_info = user_model.read(ids[0], ["name"])
print user_info["name"]

您看到两种方式都很好但是当您使用客户端lib时,代码更少且易于理解,而使用xmlrpc代理是您将处理的低级调用 希望这会对你有所帮助。

答案 1 :(得分:1)

为什么不使用openerp的xmlrpc调用。 它不需要导入帐户或openerp。甚至你可以拥有所有的功能。

答案 2 :(得分:1)

根据我的观点,必须使用Open ERP提供的XMLRPCNETSVC服务来满足这些需求。

您无需导入Open ERP的accounts模块,其他模块可能会继承accounts.tax对象并根据您的业务需求更改其行为。

最后,如果您通过手动调用这些方法而不使用Open ERP Web service来提供数据,则可能会出现意外结果/意外故障/数据库状态不一致。

答案 3 :(得分:1)

您可以使用Erppeek浏览数据,但不确定是否可以真正将数据上传到数据库,我个人使用/更喜欢XMLRPC

答案 4 :(得分:0)

您可以使用python库使用xmlrpc服务访问openerp服务器。 请检查https://github.com/OpenERP/openerp-client-lib

OpenERP SA正式支持。

答案 5 :(得分:0)

如果您想直接与数据库进行交互,您可以导入psycopg2 并且:

conn = psycopg2.connect(dbname='dbname', user='dbuser', password='dbpassword', host='dbhost')
cur = conn.cursor()
cur.execute('select * from table where id = %d' % table_id)
cur.execute('insert into table(column1, column2) values(%d, %d)' % (value1, value2))
cur.close()
conn.close()

答案 6 :(得分:0)

为什么要这样修理?!您应该创建本地化模块并在 XML文件中定义数据。这是解决OpenERP中此类问题的标准方法。

您想为哪个国家/地区插入销售税?解释更多plz。

答案 7 :(得分:-1)

来自openerp.modules.registry导入RegistryManager
registry = RegistryManager.get(“databasename”)
使用registry.cursor()作为cr:
user = registry.get('res.users')。browse(cr,userid,listids)
打印用户