The second pattern of your mail (server side default) describes the use of
the metadata argument:
my_seq = Sequence('some_seq', metadata=Base.metadata)
It would be great to have that information in the documentation (I spent
too much time on that problem and I hope others won't).
Le vendredi 11 mars 2016 21:06:07 UTC+1, Mike Bayer a écrit :
>
> I've created
>
> https://bitbucket.org/zzzeek/sqlalchemy/issues/3676/defaults-sequences-assigned-to-both-python
>
> in the hopes I can look at this at some point.
>
>
>
> On 03/11/2016 02:44 PM, Jay Camp wrote:
> > 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 [email protected] <javascript:>
> > <mailto:[email protected] <javascript:>>.
> > To post to this group, send email to [email protected]
> <javascript:>
> > <mailto:[email protected] <javascript:>>.
> > Visit this group at https://groups.google.com/group/sqlalchemy.
> > For more options, visit https://groups.google.com/d/optout.
>
--
SQLAlchemy -
The Python SQL Toolkit and Object Relational Mapper
http://www.sqlalchemy.org/
To post example code, please provide an MCVE: Minimal, Complete, and Verifiable
Example. See http://stackoverflow.com/help/mcve for a full description.
---
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 [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.