diff --git a/CHANGELOG b/CHANGELOG index 86f28a2478..b6216fed12 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,5 @@ +* Add AUTOINCREMENT to sqlite primary key + Version 1.8.0 - 2010-11-01 * Bug fixes (see mercurial logs for details) * Add timestamp sequence diff --git a/trytond/backend/sqlite/init.sql b/trytond/backend/sqlite/init.sql index d4e124e12f..95b4db5784 100644 --- a/trytond/backend/sqlite/init.sql +++ b/trytond/backend/sqlite/init.sql @@ -1,5 +1,5 @@ CREATE TABLE ir_model ( - id INTEGER PRIMARY KEY, + id INTEGER PRIMARY KEY AUTOINCREMENT, model VARCHAR, name VARCHAR, info TEXT, @@ -7,7 +7,7 @@ CREATE TABLE ir_model ( ); CREATE TABLE ir_model_field ( - id INTEGER PRIMARY KEY, + id INTEGER PRIMARY KEY AUTOINCREMENT, model INTEGER, name VARCHAR, relation VARCHAR, @@ -19,7 +19,7 @@ CREATE TABLE ir_model_field ( CREATE TABLE ir_ui_view ( - id INTEGER PRIMARY KEY, + id INTEGER PRIMARY KEY AUTOINCREMENT, model VARCHAR, "type" VARCHAR, arch TEXT, @@ -28,14 +28,14 @@ CREATE TABLE ir_ui_view ( ); CREATE TABLE ir_ui_menu ( - id INTEGER PRIMARY KEY, + id INTEGER PRIMARY KEY AUTOINCREMENT, parent INTEGER, name VARCHAR, icon VARCHAR ); CREATE TABLE ir_translation ( - id INTEGER PRIMARY KEY, + id INTEGER PRIMARY KEY AUTOINCREMENT, lang VARCHAR, src TEXT, name VARCHAR, @@ -47,7 +47,7 @@ CREATE TABLE ir_translation ( ); CREATE TABLE ir_lang ( - id INTEGER PRIMARY KEY, + id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, code VARCHAR, translatable BOOLEAN, @@ -56,7 +56,7 @@ CREATE TABLE ir_lang ( ); CREATE TABLE res_user ( - id INTEGER PRIMARY KEY, + id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, active BOOLEAN, login VARCHAR, @@ -66,25 +66,25 @@ CREATE TABLE res_user ( INSERT INTO res_user (id, login, password, name, active) VALUES (0, 'root', NULL, 'Root', 0); CREATE TABLE res_group ( - id INTEGER PRIMARY KEY, + id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR ); CREATE TABLE "res_user-res_group" ( - id INTEGER PRIMARY KEY, + id INTEGER PRIMARY KEY AUTOINCREMENT, uid INTEGER, gid INTEGER ); CREATE TABLE wkf ( - id INTEGER PRIMARY KEY, + id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, model VARCHAR, on_create BOOLEAN ); CREATE TABLE wkf_activity ( - id INTEGER PRIMARY KEY, + id INTEGER PRIMARY KEY AUTOINCREMENT, workflow INTEGER, subflow INTEGER, split_mode VARCHAR, @@ -98,7 +98,7 @@ CREATE TABLE wkf_activity ( ); CREATE TABLE wkf_transition ( - id INTEGER PRIMARY KEY, + id INTEGER PRIMARY KEY AUTOINCREMENT, act_from INTEGER, act_to INTEGER, condition VARCHAR, @@ -108,7 +108,7 @@ CREATE TABLE wkf_transition ( ); CREATE TABLE wkf_instance ( - id INTEGER PRIMARY KEY, + id INTEGER PRIMARY KEY AUTOINCREMENT, workflow INTEGER, uid INTEGER DEFAULT 0, res_id INTEGER DEFAULT 0, @@ -117,7 +117,7 @@ CREATE TABLE wkf_instance ( ); CREATE TABLE wkf_workitem ( - id INTEGER PRIMARY KEY, + id INTEGER PRIMARY KEY AUTOINCREMENT, activity INTEGER, instance INTEGER, subflow INTEGER, @@ -125,13 +125,13 @@ CREATE TABLE wkf_workitem ( ); CREATE TABLE wkf_witm_trans ( - id INTEGER PRIMARY KEY, + id INTEGER PRIMARY KEY AUTOINCREMENT, trans_id INTEGER, inst_id INTEGER ); CREATE TABLE ir_module_module ( - id INTEGER PRIMARY KEY, + id INTEGER PRIMARY KEY AUTOINCREMENT, create_uid INTEGER, create_date TIMESTAMP, write_date TIMESTAMP, @@ -146,7 +146,7 @@ CREATE TABLE ir_module_module ( ); CREATE TABLE ir_module_module_dependency ( - id INTEGER PRIMARY KEY, + id INTEGER PRIMARY KEY AUTOINCREMENT, create_uid INTEGER, create_date TIMESTAMP, write_date TIMESTAMP, diff --git a/trytond/backend/sqlite/table.py b/trytond/backend/sqlite/table.py index f22f41c899..aa31c7bf11 100644 --- a/trytond/backend/sqlite/table.py +++ b/trytond/backend/sqlite/table.py @@ -21,21 +21,47 @@ class TableHandler(TableHandlerInterface): if not self.table_exist(self.cursor, self.table_name): if not self.history: self.cursor.execute('CREATE TABLE "%s" ' \ - '(id INTEGER PRIMARY KEY)' % \ + '(id INTEGER PRIMARY KEY AUTOINCREMENT)' % \ self.table_name) else: self.cursor.execute('CREATE TABLE "%s" ' \ - '(__id INTEGER PRIMARY KEY, ' \ + '(__id INTEGER PRIMARY KEY AUTOINCREMENT, ' \ 'id INTEGER)' % self.table_name) self._update_definitions() @staticmethod def table_exist(cursor, table_name): - cursor.execute("SELECT name FROM sqlite_master " \ + cursor.execute("SELECT sql FROM sqlite_master " \ "WHERE type = 'table' AND name = %s", (table_name,)) - return bool(cursor.fetchone()) + res = cursor.fetchone() + if not res: + return False + sql, = res + + # Migration from 1.6 add autoincrement + + if not 'AUTOINCREMENT' in sql.upper(): + temp_sql = sql.replace(table_name, '_temp_%s' % table_name) + cursor.execute(temp_sql) + cursor.execute('PRAGMA table_info("' + table_name + '")') + columns = ['"%s"' % column for _, column, _, _, _, _ + in cursor.fetchall()] + cursor.execute(('INSERT INTO "_temp_%s" ' + '(' + ','.join(columns) + ') ' + 'SELECT ' + ','.join(columns) + + ' FROM "%s"') % (table_name, table_name)) + cursor.execute('DROP TABLE "%s"' % table_name) + new_sql = sql.replace('PRIMARY KEY', + 'PRIMARY KEY AUTOINCREMENT') + cursor.execute(new_sql) + cursor.execute(('INSERT INTO "%s" ' + '(' + ','.join(columns) + ') ' + 'SELECT ' + ','.join(columns) + + ' FROM "_temp_%s"') % (table_name, table_name)) + cursor.execute('DROP TABLE "_temp_%s"' % table_name) + return True @staticmethod def table_rename(cursor, old_name, new_name):