_ddl_runner=self,
_is_metadata_operation=_is_metadata_operation)
+ self.connection.execute(DropTable(table))
+
+ # traverse client side defaults which may refer to server-side
+ # sequences. noting that some of these client side defaults may also be
+ # set up as server side defaults (see http://docs.sqlalchemy.org/en/
+ # 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:
self.traverse_single(column.default)
- self.connection.execute(DropTable(table))
-
table.dispatch.after_drop(
table, self.connection,
- checkfirst=self.checkfirst,
- _ddl_runner=self,
- _is_metadata_operation=_is_metadata_operation)
+ checkfirst=self.checkfirst,
+ _ddl_runner=self,
+ _is_metadata_operation=_is_metadata_operation)
def visit_foreign_key_constraint(self, constraint):
if not self.dialect.supports_alter:
self.connection.execute(DropConstraint(constraint))
def visit_sequence(self, sequence, drop_ok=False):
+
if not drop_ok and not self._can_drop_sequence(sequence):
return
self.connection.execute(DropSequence(sequence))
from sqlalchemy import util
from sqlalchemy.testing import mock
import itertools
+from sqlalchemy.testing.assertsql import CompiledSQL, AllOf, EachOf
t = f = f2 = ts = currenttime = metadata = default_generator = None
(4, "name4", 4)])
+class SequenceAsServerDefaultTest(
+ testing.AssertsExecutionResults, fixtures.TablesTest):
+ __requires__ = ('sequences_as_server_defaults',)
+ __backend__ = True
+
+ run_create_tables = 'each'
+
+ @classmethod
+ def define_tables(cls, metadata):
+ m = metadata
+
+ s = Sequence("t_seq", metadata=m)
+ Table(
+ "t_seq_test", m,
+ Column("id", Integer, s, server_default=s.next_value()),
+ Column("data", String(50))
+ )
+
+ s2 = Sequence("t_seq_2", metadata=m)
+ Table(
+ "t_seq_test_2", m,
+ Column("id", Integer, server_default=s2.next_value()),
+ Column("data", String(50))
+ )
+
+ def test_default_textual_w_default(self):
+ with testing.db.connect() as conn:
+ conn.execute("insert into t_seq_test (data) values ('some data')")
+
+ eq_(conn.scalar("select id from t_seq_test"), 1)
+
+ def test_default_core_w_default(self):
+ t_seq_test = self.tables.t_seq_test
+ with testing.db.connect() as conn:
+ conn.execute(t_seq_test.insert().values(data="some data"))
+
+ eq_(conn.scalar(select([t_seq_test.c.id])), 1)
+
+ def test_default_textual_server_only(self):
+ with testing.db.connect() as conn:
+ conn.execute(
+ "insert into t_seq_test_2 (data) values ('some data')")
+
+ eq_(conn.scalar("select id from t_seq_test_2"), 1)
+
+ def test_default_core_server_only(self):
+ t_seq_test = self.tables.t_seq_test_2
+ with testing.db.connect() as conn:
+ conn.execute(t_seq_test.insert().values(data="some data"))
+
+ eq_(conn.scalar(select([t_seq_test.c.id])), 1)
+
+ def test_drop_ordering(self):
+ self.assert_sql_execution(
+ testing.db,
+ lambda: self.metadata.drop_all(checkfirst=False),
+ AllOf(
+ CompiledSQL(
+ "DROP TABLE t_seq_test_2",
+ {}
+ ),
+ EachOf(
+ CompiledSQL(
+ "DROP TABLE t_seq_test",
+ {}
+ ),
+ CompiledSQL(
+ "DROP SEQUENCE t_seq", # dropped as part of t_seq_test
+ {}
+ ),
+ ),
+ ),
+ CompiledSQL(
+ "DROP SEQUENCE t_seq_2", # dropped as part of metadata level
+ {}
+ ),
+ )
+
+
class SpecialTypePKTest(fixtures.TestBase):
"""test process_result_value in conjunction with primary key columns.