diff options
author | Hasan Ramezani <hasan.r67@gmail.com> | 2019-05-11 17:29:24 +0200 |
---|---|---|
committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2019-05-21 14:15:43 +0200 |
commit | 1378d665a1c85897d951f2ca9618b848fdbba2e7 (patch) | |
tree | 8f59c9a41828ec5ae7f9fe8ff0f565aaa76e9ed6 /django/db/backends/postgresql/schema.py | |
parent | 519016e5f25d7c0a040015724f9920581551cab0 (diff) | |
download | django-1378d665a1c85897d951f2ca9618b848fdbba2e7.tar.gz |
Fixed #28816 -- Prevented silencing data loss when decreasing CharField.max_length on PostgreSQL.
Diffstat (limited to 'django/db/backends/postgresql/schema.py')
-rw-r--r-- | django/db/backends/postgresql/schema.py | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/django/db/backends/postgresql/schema.py b/django/db/backends/postgresql/schema.py index 0738f009cd..82e91ce840 100644 --- a/django/db/backends/postgresql/schema.py +++ b/django/db/backends/postgresql/schema.py @@ -6,8 +6,6 @@ from django.db.backends.ddl_references import IndexColumns class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): - sql_alter_column_type = "ALTER COLUMN %(column)s TYPE %(type)s USING %(column)s::%(type)s" - sql_create_sequence = "CREATE SEQUENCE %(sequence)s" sql_delete_sequence = "DROP SEQUENCE IF EXISTS %(sequence)s CASCADE" sql_set_sequence_max = "SELECT setval('%(sequence)s', MAX(%(column)s)) FROM %(table)s" @@ -36,6 +34,11 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): output.append(like_index_statement) return output + def _field_data_type(self, field): + if field.is_relation: + return field.rel_db_type(self.connection) + return self.connection.data_types[field.get_internal_type()] + def _create_like_index_sql(self, model, field): """ Return the statement to create an index with varchar operator pattern @@ -59,7 +62,11 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): return None def _alter_column_type_sql(self, model, old_field, new_field, new_type): - """Make ALTER TYPE with SERIAL make sense.""" + self.sql_alter_column_type = 'ALTER COLUMN %(column)s TYPE %(type)s' + # Cast when data type changed. + if self._field_data_type(old_field) != self._field_data_type(new_field): + self.sql_alter_column_type += ' USING %(column)s::%(type)s' + # Make ALTER TYPE with SERIAL make sense. table = model._meta.db_table if new_type.lower() in ("serial", "bigserial"): column = new_field.column |