diff options
author | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2022-10-01 07:53:32 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-01 07:53:32 +0200 |
commit | bc3b8f152452ba0e41f28baa93c0bf8f39cddb09 (patch) | |
tree | 2f0bd277e505d6bb4b04e7112cacae9649b001e9 /django/db/backends/postgresql/schema.py | |
parent | 5e0aa362d91d000984995ce374c2d7547d8d107f (diff) | |
download | django-bc3b8f152452ba0e41f28baa93c0bf8f39cddb09.tar.gz |
Refs #34058 -- Fixed changing/deleting sequences when altering pre-Django 4.1 auto fields on PostgreSQL.
Thanks Anders Kaseorg for the report.
Follow up to 19e6efa50b603af325e7f62058364f278596758f.
Regression in 2eea361eff58dd98c409c5227064b901f41bd0d6.
Diffstat (limited to 'django/db/backends/postgresql/schema.py')
-rw-r--r-- | django/db/backends/postgresql/schema.py | 61 |
1 files changed, 36 insertions, 25 deletions
diff --git a/django/db/backends/postgresql/schema.py b/django/db/backends/postgresql/schema.py index d512ecefb6..68c5bf31af 100644 --- a/django/db/backends/postgresql/schema.py +++ b/django/db/backends/postgresql/schema.py @@ -130,6 +130,13 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): return using_sql return "" + def _get_sequence_name(self, table, column): + with self.connection.cursor() as cursor: + for sequence in self.connection.introspection.get_sequences(cursor, table): + if sequence["column"] == column: + return sequence["name"] + return None + def _alter_column_type_sql(self, model, old_field, new_field, new_type): # Drop indexes on varchar/text/citext columns that are changing to a # different type. @@ -193,44 +200,48 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): } ) column = strip_quotes(new_field.column) - sequence_name = "%s_%s_seq" % (table, column) fragment, _ = super()._alter_column_type_sql( model, old_field, new_field, new_type ) - return fragment, [ - ( - # Drop the sequence if exists (Django 4.1+ identity columns - # don't have it). - self.sql_delete_sequence - % { - "sequence": self.quote_name(sequence_name), - }, - [], - ), - ] + # Drop the sequence if exists (Django 4.1+ identity columns don't + # have it). + other_actions = [] + if sequence_name := self._get_sequence_name(table, column): + other_actions = [ + ( + self.sql_delete_sequence + % { + "sequence": self.quote_name(sequence_name), + }, + [], + ) + ] + return fragment, other_actions elif new_is_auto and old_is_auto and old_internal_type != new_internal_type: fragment, _ = super()._alter_column_type_sql( model, old_field, new_field, new_type ) column = strip_quotes(new_field.column) - sequence_name = f"{table}_{column}_seq" db_types = { "AutoField": "integer", "BigAutoField": "bigint", "SmallAutoField": "smallint", } - return fragment, [ - # Alter the sequence type if exists (Django 4.1+ identity - # columns don't have it). - ( - self.sql_alter_sequence_type - % { - "sequence": self.quote_name(sequence_name), - "type": db_types[new_internal_type], - }, - [], - ), - ] + # Alter the sequence type if exists (Django 4.1+ identity columns + # don't have it). + other_actions = [] + if sequence_name := self._get_sequence_name(table, column): + other_actions = [ + ( + self.sql_alter_sequence_type + % { + "sequence": self.quote_name(sequence_name), + "type": db_types[new_internal_type], + }, + [], + ), + ] + return fragment, other_actions else: return super()._alter_column_type_sql(model, old_field, new_field, new_type) |