changeset 6b2b2ba39ff7 in trytond:default
details: https://hg.tryton.org/trytond?cmd=changeset&node=6b2b2ba39ff7
description:
        Use RENAME and DROP COLUMN with SQLite backend

        issue7703
        review367691002
diffstat:

 CHANGELOG                       |   1 +
 trytond/backend/sqlite/table.py |  60 +++++++++++++++++++++++++---------------
 2 files changed, 39 insertions(+), 22 deletions(-)

diffs (94 lines):

diff -r 2e458b2e9a6b -r 6b2b2ba39ff7 CHANGELOG
--- a/CHANGELOG Mon Nov 08 19:30:15 2021 +0100
+++ b/CHANGELOG Mon Nov 08 19:31:34 2021 +0100
@@ -1,3 +1,4 @@
+* Use RENAME and DROP COLUMN with SQLite backend
 * Support window functions with SQLite backend
 * Use JSONB to store Dict field on PostgreSQL backend
 
diff -r 2e458b2e9a6b -r 6b2b2ba39ff7 trytond/backend/sqlite/table.py
--- a/trytond/backend/sqlite/table.py   Mon Nov 08 19:30:15 2021 +0100
+++ b/trytond/backend/sqlite/table.py   Mon Nov 08 19:31:34 2021 +0100
@@ -7,6 +7,8 @@
 import re
 import warnings
 
+from .database import sqlite
+
 __all__ = ['TableHandler']
 
 logger = logging.getLogger(__name__)
@@ -124,9 +126,17 @@
         self._update_definitions()
 
     def column_rename(self, old_name, new_name):
+        cursor = Transaction().connection.cursor()
         if self.column_exist(old_name):
             if not self.column_exist(new_name):
-                self._recreate_table({old_name: {'name': new_name}})
+                if sqlite.sqlite_version_info >= (3, 25, 0):
+                    cursor.execute('ALTER TABLE %s RENAME COLUMN %s TO %s' % (
+                            _escape_identifier(self.table_name),
+                            _escape_identifier(old_name),
+                            _escape_identifier(new_name)))
+                    self._update_definitions(columns=True)
+                else:
+                    self._recreate_table({old_name: {'name': new_name}})
             else:
                 logger.warning(
                     'Unable to rename column %s on table %s to %s.',
@@ -346,27 +356,33 @@
         transaction = Transaction()
         database = transaction.database
         cursor = transaction.connection.cursor()
-        temp_table = '__temp_%s' % self.table_name
-        TableHandler.table_rename(self.table_name, temp_table)
-        new_table = TableHandler(self._model, history=self.history)
-        for name, values in self._columns.items():
-            if name != column_name:
-                typname = values['typname']
-                size = values['size']
-                new_table._add_raw_column(
-                    name, database.sql_type(typname), field_size=size)
-        columns_name = list(new_table._columns.keys())
-        cursor.execute(
-            ('INSERT INTO %s ('
-                + ','.join(str(_escape_identifier(c))
-                    for c in columns_name)
-                + ') SELECT '
-                + ','.join(_escape_identifier(c) for c in columns_name)
-                + ' FROM %s')
-            % (_escape_identifier(self.table_name),
-                _escape_identifier(temp_table)))
-        cursor.execute('DROP TABLE %s' % _escape_identifier(temp_table))
-        self._update_definitions()
+        if sqlite.sqlite_version_info >= (3, 25, 0):
+            cursor.execute('ALTER TABLE %s DROP COLUMN %s' % (
+                    _escape_identifier(self.table_name),
+                    _escape_identifier(column_name)))
+            self._update_definitions(columns=True)
+        else:
+            temp_table = '__temp_%s' % self.table_name
+            TableHandler.table_rename(self.table_name, temp_table)
+            new_table = TableHandler(self._model, history=self.history)
+            for name, values in self._columns.items():
+                if name != column_name:
+                    typname = values['typname']
+                    size = values['size']
+                    new_table._add_raw_column(
+                        name, database.sql_type(typname), field_size=size)
+            columns_name = list(new_table._columns.keys())
+            cursor.execute(
+                ('INSERT INTO %s ('
+                    + ','.join(str(_escape_identifier(c))
+                        for c in columns_name)
+                    + ') SELECT '
+                    + ','.join(_escape_identifier(c) for c in columns_name)
+                    + ' FROM %s')
+                % (_escape_identifier(self.table_name),
+                    _escape_identifier(temp_table)))
+            cursor.execute('DROP TABLE %s' % _escape_identifier(temp_table))
+            self._update_definitions()
 
     @staticmethod
     def drop_table(model, table, cascade=False):

Reply via email to