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):