2012-07-15 5 views
9

Pythonで「スタンドアロン」スクリプトを作成して、OpenERPのORMモジュールのみを使用してsales_taxをデータベースのaccount_taxテーブルにアップロードする必要があります。私がしたいことは、以下の疑似コードのようなものです。OpenERP ORMを使用してPostgresデータベースに直接アップロードするPythonスクリプトの作成方法

1)どのsys.pathを設定する必要がありますか 2)「アカウント」モジュールをインポートする前に、どのモジュールをインポートする必要がありますか。現在、「アカウント」モジュールをインポートすると、次のエラーが表示されます。 AssertionError:レポート "report.custom"は既に存在します。 3)データベースカーソルを取得する適切な方法は何ですか。以下のコードでは、psycopg2を直接呼び出してカーソルを取得しています。

この方法ではうまくいかない場合は、XMLファイルを作成してOpenERPアプリケーション自体からデータをロードする以外の方法をお勧めします。このプロセスは、標準のOpenERPアプリケーションの外部で実行する必要があります。

擬似コード:

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. 
+0

を閲覧UIを使わずにデータを挿入する??? –

答えて

1

は、なぜあなたはopenerpのXMLRPCコールを使用しないでください。 アカウントまたはopenerpをインポートする必要はありません。すべてのorm機能を持つことができます。

18

あなたはしたいが、Webサービス経由でそれを行う場合は、OpenERPのWebサービスとのOpenERP XML-RPC 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"] 

あなたは双方向が良いと思っていますが、クライアントlを使用するとibは、xmlrpcプロキシを使用している間に理解しにくく、扱いにくい低レベルの呼び出しです これがあなたを助けてくれることを願っています。

+0

助けてくれてありがとう。 openerplibを使用するには、プレーンなOL SQL文でデータベースを照会する方法がありますか?もしそうなら、SQLクエリを実行するデータベースカーソルを取得する方法はありますか? –

+1

こんにちは、ティムは、いくつかのWebサービスを使用して直接SQLトリガを呼び出すことはできませんが、彼らは常に出口です。一部のモデルでは、SQLトリガを使用して関数を作成し、次にモデルサービスを使用して、SQLをトリガするその関数をトリガできます。 –

+0

データベースの名前はどのようにして知ることができますか? – guaka

1

私の見解によると、Open ERPによって提供されるサービスは、XMLRPCまたはNETSVCです。

Open ERPのaccountsモジュールをインポートする必要はありません。他のモジュールがaccounts.taxオブジェクトを継承し、ビジネスニーズに応じて動作を変更している可能性があります。

最終的にOpen ERP Web serviceを使用せずにこれらのメソッドを手動で呼び出してデータをフィードすると、望ましくない結果/予期しないエラー/不整合なデータベース状態が発生します。あなたが本当にDBにデータをアップロードすることができた場合

1

あなたは個人的に私はあなたがXMLRPCサービスを使用してopenerpサーバーにアクセスするためのPythonライブラリを使用することができますXMLRPC

0

あなたがDBと直接interactiしたい場合は、あなただけの輸入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() 
0

あなたがそのようにそれを修正したいのはなぜ? ローカライゼーションモジュールを作成し、のXMLファイルにデータを定義する必要があります。これは、OpenERPでこのような問題を解決するための標準的な方法です。

どの国に売上税を加算したいですか?より多くのPLZを説明してください。 openerp.modules.registryインポートRegistryManagerから

-1


レジストリ= RegistryManager.get Cr等( "データベース名")registry.cursorと
():
         ユーザー= registry.get( 'のRES .users')。こんにちはティムあなたがモジュールとしてのみORMを使用する場合、またはあなたがOEサービスをしたい(CR、ユーザーID、listids)
         印刷ユーザー

関連する問題