Por que aprender SQL para desarrollar en Odoo?
Mucha gente piensa que con el ORM uno puede ocultar las complejidades del modelo de datos de Odoo y abstraerse del mismo. Esto puede ser verdad en pequeñas instalaciones, pero lo cierto es que a medida que uno crece (y sucede, solo tienen que tener dos o tres años de ventas en un cliente medio) hay ciertas operaciones que por medio del ORM van a costar.
A que me refiero con esto? Si bien el ORM es muy util en terminos de seguridad y de simplificación de acceso a la base de datos, y nos aumenta mucho la productividad a los desarrolladores... es terriblemente lento. La gente de Odoo dice que es escalable y seguro, pero es muy lento. Simplemente hagan la prueba. Prueben creando diez mil números de serie en un solo instante. O de obtener el saldo de una cuenta contable. O sino, revisen el código y vean la cantidad de llamadas de SQL que hay (sobre todo en el módulo contable).
Personalmente me paso en tres situaciones que tuve problemas de performance que solucioné por medio del SQL. La primera fue creando miles de nros de lote. Era impensable hacerlo mediante el ORM debido a que la operación llevaba más de media hora. Cuando cambiamos el wizard y pasamos a crear los números de serie mediante SQL, se paso a tardar no más de un minuto. La otra ocasión fue para la carga del padron de ARBA para IIBB. Hacerlo mediante el ORM llevaba unas cuantas horas. Una vez que lo hicimos con SQL pasó a tardar menos de una hora.
Por último, es en algo que me pasó un momento atras. Tenía una customización que brindaba el saldo de una cuenta contable mediante un campo calculado que recorría con el ORM todos los movimientos contables. Y pasó a tener problemas debido a que para algunas cuentas (por ejemplo caja o deudores por venta) el sistema empezó a dar problemas de timeout (directamente no terminaba las consultas). Cuando cambie las consultas para que se realicen mediante SQL, el problema desapareció. Lo hice de la siguiente forma dentro del módulo:
# importa módulo sql de psycopg2
from psycopg2 import sql
...
sql_select = sql.SQL(
"""
SELECT sum(aml.debit) as debit,sum(aml.credit) as credit
FROM account_move_line aml INNER JOIN account_move am
ON aml.move_id = am.id
WHERE aml.account_id = %s
AND am.state = 'posted'
""")
self._cr.execute(sql_select, ([rec.id]))
amls = self._cr.fetchall()
Este código tiene como resultado una tupla con la suma de los débitos y créditos para los asientos validados. Todo esto para una sola cuenta contable. El resultado de la operación es practicamente instantaneo.
Otro motivo por el cual utilizar SQL, es que es muy práctico para crear reportes. Estos reportes no son los reportes normales de Q-Web, sino objetos virtuales que mapean a una vista de SQL (un excelente ejemplo lo tienen en el módulo account_debt_management). Y luego mediante vistas tipo tree se muestran los contenidos de la vista de SQL. Es algo bastante común en el mundo de Odoo.
Obviamente, usar el SQL tiene sus contraindicaciones. La primera es que no hay ningún control de seguridad, lo que lleva a que se tenga que controlar la seguridad en el código cada vez que se realiza la llamada de SQL. O hay que tener cuidado en las sentencias que uno ejecuta. Es muy facil realizar una operación de SQL que deja la base de datos en estado inconsistente (por ejemplo si no se actualizan los campos ID o create_date o create_uid), o si se realiza un DELETE.
Igualmente utilizar SQL muchas veces es util. Como decía, los problemas de performance del ORM de Odoo no se van a resolver pronto.
Acerca de:
Gustavo Orrillo
Apasionado de la programación, implementa Odoo para distintos tipos de negocios desde el año 2010. En Moldeo Interactive es Socio fundador y Programador; además de escribir en el Blog sobre distintos temas relacionados a los desarrollos que realiza.