OpenERP: Migrasi Data

Foto os

Jika Anda sudah memiliki tabel sebelumnya, Anda bisa membuat script migrasi yang akan membaca tabel tersebut dan menuliskannya kembali dalam bentuk XML.

Contoh berikut ini berasumsi sumber data sudah ada di database PostgreSQL. Siapkan terlebih dahulu modul Python yang dibutuhkan:

$ sudo apt-get install python-sqlalchemy python-psycopg2

Berikut ini contoh source.

import sqlalchemy as sa
import sys
 
 
# Awal perubahan #
dburl = 'postgresql://dbuser:dbpass@localhost/dbname' # DB auth
table_name = 'tablename' # Source table
unique_key = 'fieldname' # Source unique field
model_name = 'app.model' # OpenERP model
maps = [
    ['source_field1', 'target_field1'],
    ['source_field2', 'target_field2'],
    ]
# Akhir perubahan #
 
 
def writeln(s, indent=0):
    f.write(indent * 4 * ' ' + s + '\n')
    f.flush()
 
 
engine = sa.create_engine(dburl)
filename = sys.argv[1:] and sys.argv[1] or table_name + '.xml'
f = open(filename, 'w')
writeln('<openerp>')
writeln('<data noupdate="1">', 1)
q = engine.execute("SELECT * FROM %s ORDER BY 1" % table_name)
for r in q:
    writeln('<record model="%s" id="%s">' % (model_name, r[unique_key]), 2)
    for source, target in maps:
        writeln('<field name="%s">%s</field>' % (target, r[source]), 3)
    writeln('</record>', 2)
writeln('</data>', 1)
writeln('</openerp>')
f.close()

Sesuaikanlah pada bagian Awal perubahan dan Akhir perubahan, lalu simpan dengan nama file migrasi_hello.py. Lalu jalankan:

$ python migrasi_hello.py

Jika lancar, akan terbentuk file tablename.xml sesuai table_name yang diisi. Lalu salinlah ke direktori OpenERP pada modul yang dimaksud, contoh:

$ sudo cp hello.xml /usr/share/pyshared/openerp-server/addons/hello/hello_data.xml

Kemudian ubah /usr/share/pyshared/openerp-server/addons/hello/__openerp__.py pada bagian update_xml menjadi:

...
'update_xml': [
    ...
    'hello_data.xml',
    ],
...

Kemudian lakukan prosedur update modul hello:

$ sudo start-stop-daemon --start --chuid openerp --exec /usr/bin/openerp-server -- --config=/etc/openerp-server.conf --stop-after-init --database=dbname --update=hello

Lalu lihat di menu, mudah-mudahan migrasi berlangung lancar.

Option noupdate="1" pada XML menunjukkan jika record sudah ada maka proses update tidak akan melakukan perubahan.

Update 8 Mei 2012
Jika ada field foreign key, maka contohnya adalah:

<field name="user_id" ref="ilham"/>

dimana ilham adalah ID data dari XML lainnya. Anda juga bisa melihat link ini untuk contoh yang lebih jelas penggunaan atribut ref untuk field foreign key.

Selamat mencoba.