From 1984b6d3c7fd95dd22203cb75fb3fb65348c4158 Mon Sep 17 00:00:00 2001 From: Federico Caselli Date: Thu, 18 Mar 2021 23:38:09 +0100 Subject: Allow dropping a schema with a sequence shared by more than one table. Fixes: #6071 Change-Id: I5c4483abf075622cccb73cb4c4f8c873174b4e32 --- lib/sqlalchemy/sql/ddl.py | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) (limited to 'lib/sqlalchemy/sql') diff --git a/lib/sqlalchemy/sql/ddl.py b/lib/sqlalchemy/sql/ddl.py index a166a6bdf..8d8e68d2f 100644 --- a/lib/sqlalchemy/sql/ddl.py +++ b/lib/sqlalchemy/sql/ddl.py @@ -1002,7 +1002,7 @@ class SchemaDropper(DDLBase): seq_coll = [ s for s in metadata._sequences.values() - if s.column is None and self._can_drop_sequence(s) + if self._can_drop_sequence(s) ] event_collection = [t for (t, fks) in collection if t is not None] @@ -1018,14 +1018,17 @@ class SchemaDropper(DDLBase): for table, fkcs in collection: if table is not None: self.traverse_single( - table, drop_ok=True, _is_metadata_operation=True + table, + drop_ok=True, + _is_metadata_operation=True, + _ignore_sequences=seq_coll, ) else: for fkc in fkcs: self.traverse_single(fkc) for seq in seq_coll: - self.traverse_single(seq, drop_ok=True) + self.traverse_single(seq, drop_ok=seq.column is None) metadata.dispatch.after_drop( metadata, @@ -1073,7 +1076,13 @@ class SchemaDropper(DDLBase): self.connection.execute(DropIndex(index)) - def visit_table(self, table, drop_ok=False, _is_metadata_operation=False): + def visit_table( + self, + table, + drop_ok=False, + _is_metadata_operation=False, + _ignore_sequences=[], + ): if not drop_ok and not self._can_drop_table(table): return @@ -1093,7 +1102,10 @@ class SchemaDropper(DDLBase): # latest/core/defaults.html#associating-a-sequence-as-the-server-side- # default), so have to be dropped after the table is dropped. for column in table.columns: - if column.default is not None: + if ( + column.default is not None + and column.default not in _ignore_sequences + ): self.traverse_single(column.default) table.dispatch.after_drop( -- cgit v1.2.1