Se rendre au contenu

Why Odoo Customizations via API are Faster than via SQL

Rights, properties, and translations can be changed via the Odoo Shell in just a few lines. A SQL statement often requires several preliminary queries for this.
13 août 2026 par
Martin Schmid
Odoo Administration ORM Base de données

Pourquoi les personnalisations Odoo via l'API sont plus rapides que via SQL

Les droits, les propriétés et les traductions peuvent être modifiés en quelques lignes via la console Odoo. Une requête SQL nécessite souvent plusieurs requêtes préliminaires pour cela.

M
Martin Schmid
2026-08-13

Attribuer des droits sans toucher à la base de données

Dans le support, quelqu'un doit avoir les droits d'administrateur, et immédiatement. Le chemin le plus court semble passer par la base de données : un UPDATE sur la table des droits, c'est fait. Via la shell Odoo, il faut deux lignes, et toutes les vérifications fonctionnent.

user = env['res.users'].search([('login', '=', 'benutzer@example.com')])
user.write({'group_ids': [Command.link(env.ref('base.group_system').id)]})
env.cr.commit()

La shell est incluse dans chaque installation. Un appel avec odoo-bin shell -d <datenbank> la lance, sans que le serveur web ne démarre ni que l'exploitation productive en soit affectée.

Ce que font réellement write et commit

write() est le chemin d'écriture régulier du modèle de données. Il vérifie les champs obligatoires et les plages de valeurs, recalcule les champs calculés stockés, respecte les règles d'accès et enregistre qui a modifié l'enregistrement. Un UPDATE contourne tout cela et n'insère que la valeur.

env.cr.commit() valide la transaction. La shell rejette sinon toute modification à la sortie, ce qui coûte régulièrement le travail aux débutants.

La règle derrière est simple. Ce qui est plus facilement accessible via l'API ne doit pas être fait manuellement via SQL.

Avec les propriétés, SQL collecte d'abord les données

L'écart entre les deux chemins s'élargit dès que les données sont imbriquées. Odoo stocke les propriétés sous forme JSON, et la valeur seule se trouve sur l'enregistrement. La définition associée avec le type et la valeur par défaut se trouve sur l'enregistrement supérieur, par exemple le projet pour la tâche.

Si vous souhaitez modifier cela via SQL, vous devez d'abord identifier l'enregistrement parent, lire la définition issue d'un champ JSON, rechercher la clé interne de la propriété souhaitée et construire l'opération JSON pour l'enregistrement lui-même. Quatre étapes avant même que l'instruction ne soit complète. Un write() sur le champ accomplit la même tâche en une seule ligne, car Odoo combine la définition et la valeur elle-même.

Les traductions sont stockées en JSON depuis Odoo 16

Odoo stocke également les champs traduisibles en JSON, avec une entrée par langue dans la même colonne. L'ancienne table de traduction n'existe plus.

Via SQL, la modification JSON se fait exactement au bon endroit, sans endommager les autres langues. Via l'API, un changement de langue dans le contexte suffit :

produkt = env['product.template'].browse(42)
produkt.with_context(lang='de_DE').write({'name': 'Bürostuhl'})
env.cr.commit()

Le texte anglais reste intact car Odoo adresse directement l'entrée appropriée.

Quand SQL reste quand même l'outil approprié

Deux cas subsistent. Si le modèle de données ne charge pas du tout en raison de modules bloqués, la Shell ne démarre pas non plus, et une intervention SQL est le seul moyen de retour. Pour les modifications de masse sur des centaines de milliers de lignes, le détour par l'ORM coûte plus de temps que ne le valent les vérifications. Dans ce cas, le recalcul des champs calculés concernés doit ensuite être effectué.

Pour tout ce qui se situe entre les deux, la Shell est le chemin le plus court. L'appel prend quelques secondes, et la première requête révèle déjà si l'expression de recherche correspond à ce qu'elle doit correspondre, ce Documentation Odoo sur la ligne de commande décrit les autres paramètres.

Archives
Why Odoo Does Not Display Visitor Country and How to Fix It
An incorrectly formatted installed GeoIP package can completely halt country statistics. Learn how the error occurs, how to pinpoint it in four steps, and where the database originates.