Thanks for the explanation. It makes sense now. To restate what you said this won't work because `id_sequence` isn't attached to the metadata:
id_sequence = Sequence('drop_seq_col') col = Column(Integer, unique=True, nullable=False, server_default=id_sequence.next_value()) I assume by making the sequence the Python default to `col` I implicitly attached it to the metadata as a convenient side-effect. But having the Python + server_default hits the edge case. But you're right, all I really want is the server_default and attach sequence to metadata. Thanks a bunch! Jay On Thursday, March 10, 2016 at 6:52:12 PM UTC-8, Jay Camp wrote: > > Postgres: 9.4 > SQLAlchemy: 1.0.11 > > When a sequence is created against a column, calling `metadata.drop_all()` > tries to drop the sequence before dropping the table and fails because the > table is still referencing the sequence. Manually dropping the table then > dropping the sequence works. > > The test script is attached. Here is the console output: > > 2016-03-10 18:44:27,101 INFO sqlalchemy.engine.base.Engine select version() > 2016-03-10 18:44:27,101 INFO sqlalchemy.engine.base.Engine {} > 2016-03-10 18:44:27,104 INFO sqlalchemy.engine.base.Engine select > current_schema() > 2016-03-10 18:44:27,104 INFO sqlalchemy.engine.base.Engine {} > 2016-03-10 18:44:27,106 INFO sqlalchemy.engine.base.Engine SELECT > CAST('test plain returns' AS VARCHAR(60)) AS anon_1 > 2016-03-10 18:44:27,106 INFO sqlalchemy.engine.base.Engine {} > 2016-03-10 18:44:27,109 INFO sqlalchemy.engine.base.Engine SELECT > CAST('test unicode returns' AS VARCHAR(60)) AS anon_1 > 2016-03-10 18:44:27,109 INFO sqlalchemy.engine.base.Engine {} > 2016-03-10 18:44:27,110 INFO sqlalchemy.engine.base.Engine show > standard_conforming_strings > 2016-03-10 18:44:27,110 INFO sqlalchemy.engine.base.Engine {} > 2016-03-10 18:44:27,111 INFO sqlalchemy.engine.base.Engine select relname > from pg_class c join pg_namespace n on n.oid=c.relnamespace where > pg_catalog.pg_table_is_visible(c.oid) and relname=%(name)s > 2016-03-10 18:44:27,112 INFO sqlalchemy.engine.base.Engine {'name': > u'drop_seq_test'} > 2016-03-10 18:44:27,115 INFO sqlalchemy.engine.base.Engine SELECT relname > FROM pg_class c join pg_namespace n on n.oid=c.relnamespace where > relkind='S' and n.nspname=current_schema() and relname=%(name)s > 2016-03-10 18:44:27,115 INFO sqlalchemy.engine.base.Engine {'name': > u'drop_seq_col'} > 2016-03-10 18:44:27,117 INFO sqlalchemy.engine.base.Engine CREATE SEQUENCE > drop_seq_col > 2016-03-10 18:44:27,117 INFO sqlalchemy.engine.base.Engine {} > 2016-03-10 18:44:27,127 INFO sqlalchemy.engine.base.Engine COMMIT > 2016-03-10 18:44:27,129 INFO sqlalchemy.engine.base.Engine > CREATE TABLE drop_seq_test ( > col INTEGER DEFAULT nextval('drop_seq_col') NOT NULL, > source_id SERIAL NOT NULL, > PRIMARY KEY (source_id), > UNIQUE (col) > ) > > > 2016-03-10 18:44:27,129 INFO sqlalchemy.engine.base.Engine {} > 2016-03-10 18:44:27,147 INFO sqlalchemy.engine.base.Engine COMMIT > 2016-03-10 18:44:27,148 INFO sqlalchemy.engine.base.Engine select relname > from pg_class c join pg_namespace n on n.oid=c.relnamespace where > pg_catalog.pg_table_is_visible(c.oid) and relname=%(name)s > 2016-03-10 18:44:27,148 INFO sqlalchemy.engine.base.Engine {'name': > u'drop_seq_test'} > 2016-03-10 18:44:27,150 INFO sqlalchemy.engine.base.Engine SELECT relname > FROM pg_class c join pg_namespace n on n.oid=c.relnamespace where > relkind='S' and n.nspname=current_schema() and relname=%(name)s > 2016-03-10 18:44:27,150 INFO sqlalchemy.engine.base.Engine {'name': > u'drop_seq_col'} > 2016-03-10 18:44:27,151 INFO sqlalchemy.engine.base.Engine DROP SEQUENCE > drop_seq_col > 2016-03-10 18:44:27,151 INFO sqlalchemy.engine.base.Engine {} > 2016-03-10 18:44:27,152 INFO sqlalchemy.engine.base.Engine ROLLBACK > Traceback (most recent call last): > File "drop-sequence.py", line 17, in <module> > metadata.drop_all() > File > "/Users/jay/.virtualenvs/pinto/lib/python2.7/site-packages/sqlalchemy/sql/schema.py", > > line 3722, in drop_all > tables=tables) > File > "/Users/jay/.virtualenvs/pinto/lib/python2.7/site-packages/sqlalchemy/engine/base.py", > > line 1856, in _run_visitor > conn._run_visitor(visitorcallable, element, **kwargs) > File > "/Users/jay/.virtualenvs/pinto/lib/python2.7/site-packages/sqlalchemy/engine/base.py", > > line 1481, in _run_visitor > **kwargs).traverse_single(element) > File > "/Users/jay/.virtualenvs/pinto/lib/python2.7/site-packages/sqlalchemy/sql/visitors.py", > > line 121, in traverse_single > return meth(obj, **kw) > File > "/Users/jay/.virtualenvs/pinto/lib/python2.7/site-packages/sqlalchemy/sql/ddl.py", > > line 871, in visit_metadata > table, drop_ok=True, _is_metadata_operation=True) > File > "/Users/jay/.virtualenvs/pinto/lib/python2.7/site-packages/sqlalchemy/sql/visitors.py", > > line 121, in traverse_single > return meth(obj, **kw) > File > "/Users/jay/.virtualenvs/pinto/lib/python2.7/site-packages/sqlalchemy/sql/ddl.py", > > line 916, in visit_table > self.traverse_single(column.default) > File > "/Users/jay/.virtualenvs/pinto/lib/python2.7/site-packages/sqlalchemy/sql/visitors.py", > > line 121, in traverse_single > return meth(obj, **kw) > File > "/Users/jay/.virtualenvs/pinto/lib/python2.7/site-packages/sqlalchemy/sql/ddl.py", > > line 934, in visit_sequence > self.connection.execute(DropSequence(sequence)) > File > "/Users/jay/.virtualenvs/pinto/lib/python2.7/site-packages/sqlalchemy/engine/base.py", > > line 914, in execute > return meth(self, multiparams, params) > File > "/Users/jay/.virtualenvs/pinto/lib/python2.7/site-packages/sqlalchemy/sql/ddl.py", > > line 68, in _execute_on_connection > return connection._execute_ddl(self, multiparams, params) > File > "/Users/jay/.virtualenvs/pinto/lib/python2.7/site-packages/sqlalchemy/engine/base.py", > > line 968, in _execute_ddl > compiled > File > "/Users/jay/.virtualenvs/pinto/lib/python2.7/site-packages/sqlalchemy/engine/base.py", > > line 1146, in _execute_context > context) > File > "/Users/jay/.virtualenvs/pinto/lib/python2.7/site-packages/sqlalchemy/engine/base.py", > > line 1341, in _handle_dbapi_exception > exc_info > File > "/Users/jay/.virtualenvs/pinto/lib/python2.7/site-packages/sqlalchemy/util/compat.py", > > line 200, in raise_from_cause > reraise(type(exception), exception, tb=exc_tb) > File > "/Users/jay/.virtualenvs/pinto/lib/python2.7/site-packages/sqlalchemy/engine/base.py", > > line 1139, in _execute_context > context) > File > "/Users/jay/.virtualenvs/pinto/lib/python2.7/site-packages/sqlalchemy/engine/default.py", > > line 450, in do_execute > cursor.execute(statement, parameters) > sqlalchemy.exc.InternalError: (psycopg2.InternalError) cannot drop > sequence drop_seq_col because other objects depend on it > DETAIL: default for table drop_seq_test column col depends on sequence > drop_seq_col > HINT: Use DROP ... CASCADE to drop the dependent objects too. > [SQL: 'DROP SEQUENCE drop_seq_col'] > > Is this a bug? > > Thanks > > Jay > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.