--- /dev/null
+.. change::
+ :tags: bug, sql, orm
+ :tickets: 6668
+
+ Fixed the class hierarchy for the :class:`_schema.Sequence` and the more
+ general :class:`_schema.DefaultGenerator` base, as these are "executable"
+ as statements they need to include :class:`_sql.Executable` in their
+ hierarchy, not just :class:`_roles.StatementRole` as was applied
+ arbitrarily to :class:`_schema.Sequence` previously. The fix allows
+ :class:`_schema.Sequence` to work in all ``.execute()`` methods including
+ with :meth:`_orm.Session.execute` which was not working in the case that a
+ ``do_orm_execute()`` handler was also established.
+
if self._echo:
self._log_info(statement)
- self._log_info("%r", parameters)
+ self._log_info("[raw sql] %r", parameters)
try:
for fn in (
()
from .base import _bind_or_error
from .base import DedupeColumnCollection
from .base import DialectKWArgs
+from .base import Executable
from .base import SchemaEventTarget
from .coercions import _document_text_coercion
from .elements import ClauseElement
self._set_target_column(_column)
-class DefaultGenerator(SchemaItem):
+class DefaultGenerator(Executable, SchemaItem):
"""Base class for column *default* values."""
__visit_name__ = "default_generator"
self.order = order
-class Sequence(IdentityOptions, roles.StatementRole, DefaultGenerator):
+class Sequence(IdentityOptions, DefaultGenerator):
"""Represents a named database sequence.
The :class:`.Sequence` object represents the name and configurational
run_inserts = None
__backend__ = True
+ @testing.combinations(
+ (True,), (False,), argnames="add_do_orm_execute_event"
+ )
@testing.requires.sequences
- def test_sequence_execute(self, connection):
- seq = Sequence("some_sequence")
- seq.create(connection)
- try:
- sess = Session(connection)
- eq_(sess.execute(seq), connection.dialect.default_sequence_base)
- finally:
- seq.drop(connection)
+ def test_sequence_execute(
+ self, connection, metadata, add_do_orm_execute_event
+ ):
+ seq = Sequence("some_sequence", metadata=metadata)
+ metadata.create_all(connection)
+ sess = Session(connection)
+
+ if add_do_orm_execute_event:
+ evt = mock.Mock(return_value=None)
+ event.listen(
+ sess, "do_orm_execute", lambda ctx: evt(ctx.statement)
+ )
+ eq_(sess.execute(seq), connection.dialect.default_sequence_base)
+ if add_do_orm_execute_event:
+ eq_(evt.mock_calls, [mock.call(seq)])
def test_parameter_execute(self):
users = self.tables.users