Warum Odoo-Anpassungen über die API schneller gehen als per SQL
Rechte, Properties und Übersetzungen lassen sich über die Odoo-Shell in wenigen Zeilen ändern. Ein SQL-Statement braucht dafür oft erst mehrere Vorabfragen.
Rechte vergeben, ohne die Datenbank anzufassen
Im Support braucht jemand Administratorrechte, und zwar sofort. Der kürzeste Weg scheint durch die Datenbank zu führen: ein UPDATE auf die Rechtetabelle, erledigt. Über die Odoo-Shell sind es zwei Zeilen, und alle Prüfungen laufen mit.
user = env['res.users'].search([('login', '=', 'benutzer@example.com')])
user.write({'group_ids': [Command.link(env.ref('base.group_system').id)]})
env.cr.commit()
Die Shell steckt in jeder Installation. Ein Aufruf mit odoo-bin shell -d <datenbank> startet sie, ohne dass ein Webserver hochfährt oder der Produktivbetrieb etwas davon merkt.
Was write und commit tatsächlich tun
write() ist der reguläre Schreibweg des Datenmodells. Es prüft Pflichtangaben und Wertebereiche, berechnet gespeicherte Rechenfelder neu, beachtet Zugriffsregeln und schreibt fest, wer den Datensatz geändert hat. Ein UPDATE übergeht all das und trägt nur den Wert ein.
env.cr.commit() bestätigt die Transaktion. Die Shell verwirft beim Verlassen sonst jede Änderung, was Einsteiger regelmäßig ihre Arbeit kostet.
Die Regel dahinter ist schlicht. Was über die API einfacher zu erreichen ist, wird nicht von Hand per SQL erledigt.
Bei Properties sammelt SQL erst einmal Daten
Der Abstand zwischen beiden Wegen wächst, sobald die Daten verschachtelt liegen. Odoo speichert Properties als JSON, und der Wert allein steht am Datensatz. Die zugehörige Definition mit Typ und Vorgabewert liegt auf dem übergeordneten Datensatz, etwa dem Projekt zur Aufgabe.
Wer das per SQL ändern will, ermittelt zuerst den übergeordneten Datensatz, liest dort die Definition aus einem JSON-Feld, sucht den internen Schlüssel der gewünschten Eigenschaft und baut daraus die JSON-Operation für den eigentlichen Datensatz. Vier Schritte, bevor das Statement überhaupt fertig ist. Ein write() auf das Feld erledigt dieselbe Aufgabe in einer Zeile, weil Odoo Definition und Wert selbst zusammenführt.
Übersetzungen liegen seit Odoo 16 im JSON
Übersetzbare Felder speichert Odoo ebenfalls als JSON, mit einem Eintrag je Sprache in derselben Spalte. Die frühere Übersetzungstabelle gibt es nicht mehr.
Per SQL bedeutet das JSON-Bearbeitung an genau der richtigen Stelle, ohne die anderen Sprachen zu beschädigen. Über die API genügt ein Sprachwechsel im Kontext:
produkt = env['product.template'].browse(42)
produkt.with_context(lang='de_DE').write({'name': 'Bürostuhl'})
env.cr.commit()
Der englische Text bleibt unangetastet, weil Odoo den passenden Eintrag selbst adressiert.
Wann SQL trotzdem das richtige Werkzeug ist
Zwei Fälle bleiben. Lädt das Datenmodell wegen festhängender Module gar nicht erst, startet auch die Shell nicht, und ein SQL-Eingriff ist der einzige Weg zurück. Bei Massenänderungen über sechsstellige Zeilenzahlen kostet der Umweg über das ORM mehr Zeit, als die Prüfungen wert sind. Dann gehört anschließend die Neuberechnung der betroffenen Rechenfelder dazu.
Für alles dazwischen ist die Shell der kürzere Weg. Der Aufruf dauert Sekunden, und die erste Abfrage verrät bereits, ob der Suchausdruck trifft, was er treffen soll. Die Odoo-Dokumentation zur Kommandozeile beschreibt die übrigen Parameter.