Dienstag, 25. November 2014

Odoo/OpenERP: Wenn der "Primary Key" mal verloren geht.

Bei unseren Odoo/OpenERP Installationen kam es nach einigen Updates vor, dass die "Sequence ID"s der PostgreSQL Datenbank nicht mehr gestimmt haben.

Hintergrund:
Jede Tabelle in der Odoo-Datenbank hat ein ID-Feld. Darauf zeigt der "Primary Key". Dadurch wird verhindert, dass ein Datensatz doppelt vorkommt.
Über einen "Autozähler" wird der Wert beim "Insert" erhöht, was über eine Sequenz verwaltet wird.

Diese ID war auf einmal zu niedrig, was dazu führte, dass keine neuen Datensätze vor allem in den Tabellen der Website hinzugefügt werden konnten.

Das folgende Skript kontrolliert alle Tabellen der Odoo-Datenbank und setzt den Sequenz Wert auf den MAX-Wert.


# -*- coding: UTF-8 -*- ############################################################################## # # Python Script for Odoo, Open Source Management Solution # Copyright (C) 2014-now Equitania Software GmbH(<http://www.equitania.de>). # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # ############################################################################## __author__ = 'm.schmid@equitania.de' import psycopg2 #Connection with the Connectionstring conn = psycopg2.connect('dbname=Databasename user=postgres host=localhost password=Databasepassword') cur = conn.cursor() #Gets the tables with an primary key cur.execute("""select tc.table_schema, tc.table_name, kc.column_name from information_schema.table_constraints tc, information_schema.key_column_usage kc where tc.constraint_type = 'PRIMARY KEY' and kc.table_name = tc.table_name and kc.table_schema = tc.table_schema and kc.constraint_name = tc.constraint_name order by 1, 2;""") #Tables that have the id field, without a value. blacklist = ['ir_act_client', 'ir_act_report', 'ir_act_report_xml', 'ir_act_server', 'ir_act_url', 'ir_act_window'] for table in cur.fetchall(): if table[1] not in blacklist: #Max ID cur.execute("SELECT MAX(id) FROM %s;" % (table[1])) max_id = cur.fetchone() #Next ID cur.execute("SELECT nextval('%s_id_seq');" % (table[1])) next_id = cur.fetchone() #If max_id bigger than next_id and both aren't None if max_id[0] != None and next_id[0] != None: if int(next_id[0]) <= int(max_id[0]): #Sets the PKey to the max_id + 1 cur.execute("SELECT setval('%s_id_seq', %s);" % (table[1], max_id[0] + 1)) print("Tabelle " + table[1] + " hatte eine fehlerhafte ID.") else: print('ID für die Tabelle ' + table[1] + ' ist fehlerfrei.') else: print('Kein Eintrag in der Tabelle ' + table[1] + '.') print("Fertig!")

Keine Kommentare:

Kommentar veröffentlichen