Ir al contenido

Odoo CLI y debugging: shell, logs y gestión de -d/-u

Comandos imprescindibles para desarrollo rápido y resolución de problemas
1 de octubre de 2026 por
Odoo CLI y debugging: shell, logs y gestión de -d/-u
ATEMI, Aitor Atencia

Odoo · CLI · Debugging

Reiniciar el contenedor y pulsar F5 hasta que el error desaparezca no es una estrategia de depuración. odoo-bin trae un shell interactivo, un runner de tests con filtros finos y un sistema de logs configurable por logger: con media docena de comandos se diagnostica casi todo sin tocar el navegador.

Logo Odoo
La terminal es más rápida que el modo desarrollador para casi cualquier diagnóstico.

Instalar y actualizar

-d, -i, -u y --stop-after-init

-d elige la base de datos, -i instala módulos y -u los actualiza (recarga Python, vuelve a cargar XML/CSV y ejecuta los scripts de migración si cambia la versión del manifest). Añadir --stop-after-init hace que el proceso termine en cuanto acaba de cargar, que es justo lo que quieres en un script o en CI: el código de salida te dice si fue bien.

# Actualizar un módulo y salir (útil en scripts y CI)
odoo-bin -c odoo.conf -d mi_bd -u mi_modulo --stop-after-init

# Varios módulos a la vez, separados por comas, sin espacios
odoo-bin -c odoo.conf -d mi_bd -u modulo_a,modulo_b --stop-after-init

# Desarrollo: recarga Python y XML al guardar, un solo proceso
odoo-bin -c odoo.conf -d mi_bd --dev=all --workers=0

Shell

odoo-bin shell: el ORM en un REPL

El shell arranca Odoo sin servidor HTTP y te deja una variable env lista para usar como superusuario. Es la herramienta perfecta para reproducir un bug, inspeccionar datos o probar un dominio antes de escribirlo en una vista. La trampa: nada se guarda si no haces env.cr.commit(), y al salir la transacción se revierte.

$ odoo-bin shell -c odoo.conf -d mi_bd --no-http

>>> orders = env['sale.order'].search([('state', '=', 'draft')], limit=5)
>>> orders.mapped('amount_total')
[120.0, 89.5, 1500.0, 42.0, 310.0]
>>> # Probar como un usuario concreto (con sus ACL y record rules)
>>> user = env.ref('base.user_demo')
>>> env['sale.order'].with_user(user).search_count([])
12
>>> env.cr.rollback()   # o env.cr.commit() si quieres persistir

También puedes pasarle un script por la entrada estándar, lo que lo convierte en una alternativa limpia a los scripts XML-RPC para tareas puntuales de mantenimiento:

odoo-bin shell -c odoo.conf -d mi_bd --no-http < scripts/recalcular_totales.py

Logs

Subir el nivel de log solo donde hace falta

--log-level=debug inunda la consola. Es mucho más útil --log-handler, que ajusta el nivel por logger: puedes ver todas las queries SQL sin el resto del ruido, o solo los logs de tu módulo.

# Ver todas las queries SQL que ejecuta el ORM
odoo-bin -c odoo.conf -d mi_bd --log-handler=odoo.sql_db:DEBUG

# Solo tu módulo en DEBUG, el resto en INFO
odoo-bin -c odoo.conf -d mi_bd --log-handler=odoo.addons.mi_modulo:DEBUG

# Silenciar un logger ruidoso
odoo-bin -c odoo.conf -d mi_bd --log-handler=werkzeug:WARNING

Ver las queries es la forma más rápida de detectar un N+1: si al abrir una lista aparecen cien SELECT casi idénticos, hay un bucle que lee registro a registro (ver performance en Odoo).

Tests y breakpoints

Ejecutar un solo test y pararse dentro

--test-tags acepta filtros por módulo, clase y método, así que no hace falta lanzar la suite entera para comprobar un arreglo. Combinado con --workers=0, un breakpoint() en el código te abre pdb en mitad del test.

# Todos los tests de un módulo
odoo-bin -c odoo.conf -d test_db -u mi_modulo --test-tags=/mi_modulo --stop-after-init

# Una clase concreta
... --test-tags=/mi_modulo:TestSaleBlock

# Un solo método
... --test-tags=/mi_modulo:TestSaleBlock.test_blocks_without_vat
Quiero…Comando o flag
Aplicar cambios de XML/Python de un módulo-u mi_modulo --stop-after-init
Recargar al guardar en desarrollo--dev=all --workers=0
Inspeccionar datos o reproducir un bugodoo-bin shell -d mi_bd
Ver las queries SQL--log-handler=odoo.sql_db:DEBUG
Ejecutar un test concreto--test-tags=/modulo:Clase.metodo
Copia de producción segura para pruebasodoo-bin neutralize -d copia_bd
Esqueleto de un módulo nuevoodoo-bin scaffold nombre ruta/

Resumen

-u con --stop-after-init para actualizar, shell para inspeccionar (sin olvidar el commit), --log-handler para ver solo lo que importa y --test-tags con --workers=0 para depurar un test concreto. Y nunca pruebes sobre una copia de producción sin neutralizarla.

en Odoo
Acciones de servidor seguras: automatizar sin abrir vulnerabilidades
Validación, permisos y cuándo usar crons vs server actions