Importando clientes con xmlrpc desde una base de datos SQL

10 de julio de 2023 por
Gustavo Orrillo
| Sin comentarios aún
 

Cuando uno empieza a trabajar con Odoo, muchas veces debe importar los maestros de clientes y proveedores. Y por lo general, lo hacemos desde dos fuentes de datos. O un archivo CSV o Excel (que ya cubrimos en otros posts) o desde una base de datos (por lo general relacional, pero nunca falta el ocasional DBF). 

En este post vamos a dar un ejemplo de como leer los datos de una base de datos SQL Server. una base de datos sql server llamada dbtest, a la que se accede en el servidor remotehost. Para ello usamos una librería de Python llamada pymssql

La librería se instala en el ambiente donde ejecutamos el script con el comando pip de la siguiente manera:

sudo pip3 install pymssql

Y supongamos que tenemos que conectarnos con la base de datos dbtest usando usuario y password. Una vez conectados, debemos leer los datos de la tabla Clientes y con ellos actualizar Odoo. Primero nos conectamos a la base de datos

import pymssql
conn = pymssql.connect(server='remotehost:3500',\
​ ​ user='dbuser', password='dbpassword', database='dbtest')

Y luego creamos un cursor y ejecutamos la sentencia "select * from clientes" (no saber SQL es imperdonable para el consultor de Odoo)

cursor = conn.cursor(as_dict=True)
cursor.execute('select * from Clientes')

Luego debemos leer los resultados del cursor e iterar con ellos. Supongamos que los resultados del query son tres columnas (codigo, nombre, calle) y van a actualizar el modelo res.partner de la siguiente manera:

  • codigo: columna ref
  • nombre: columna name
  • calle: columna street

Esto es a modo resumido, para este post. En la realidad debemos leer muchas más columnas, realizar más transformaciones y actualizar una cantidad de columnas y modelos más grande. Ahora, si queremos actualizar el modelo res.partner con los datos leidos (usando la columna ref como referencia, actualizando y creando filas en base a esa columna). Eso lo hacemos de la siguiente manera: 

row = cursor.fetchone()
while row:
print(row)
row = cursor.fetchone()
 ref = row.get('codigo')
 street = row.get('domicilio')
 name = row.get('nombre')
vals = {
'name': name,
'ref': ref,
'street': street,
}
partner_id = sock.execute(dbname,uid,pwd,'res.partner','search',\
​ ​ ​[('ref','=',ref)])
if not partner_id:
return_id = sock.execute(dbname,uid,pwd,'res.partner','create',vals)
else:
return_id = sock.execute(dbname,uid,pwd,'res.partner','write',partner_id,vals)
print(return_id)

Y si queremos ver todo el código (para establecer la conección a la base de datos y a Odoo), para luego consultar los datos de clientes y posteriormente actualizar Odoo es como sigue:

#!/usr/bin/python3

import pymssql
from xmlrpc import client
import ssl

username = 'gustavo' #the user
pwd = 'supergus' #the user
dbname = 'mytestdb' #the database

gcontext = ssl._create_unverified_context()

# Get the uid
sock_common = client.ServerProxy (\
​'http://localhost:8069/xmlrpc/common',context=gcontext)
uid = sock_common.login(dbname, username, pwd)

#replace localhost with the address of the server
sock = client.ServerProxy(\
​'http://localhost:8069/xmlrpc/object',context=gcontext)

conn = pymssql.connect(server='remotehost:3500',\
​ user='dbuser', password='dbpassword', database='dbtest')

cursor = conn.cursor(as_dict=True)
cursor.execute('select * from Clientes')
row = cursor.fetchone()
while row:
print(row)
row = cursor.fetchone()
 ref = row.get('codigo')
 street = row.get('domicilio')
 name = row.get('nombre')
vals = {
'name': name,
'ref': ref,
'street': street,
}
partner_id = sock.execute(dbname,uid,pwd,'res.partner','search',\
​[('ref','=',ref)])
if not partner_id:
return_id = sock.execute(dbname,uid,pwd,'res.partner','create',vals)
else:
return_id = sock.execute(dbname,uid,pwd,'res.partner','write',partner_id,vals)
print(return_id)


xxxx

Gustavo Orrillo 10 de julio de 2023
Compartir
Archivar
Identificarse dejar un comentario