diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2018-07-10 09:41:21 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2018-07-10 22:38:52 -0400 |
| commit | 532566ba1f28ff8a6afa6eacc10c59eb918501f6 (patch) | |
| tree | c3b2d7ef4e07ca1b5919cfe0aa6415b64bfb3aec /test/sql | |
| parent | f7076ecf361f276f5ddb81f80931e5c88215e8ca (diff) | |
| download | sqlalchemy-532566ba1f28ff8a6afa6eacc10c59eb918501f6.tar.gz | |
Drop default-related structures after the Table is dropped.
Fixed bug where a :class:`.Sequence` would be dropped explicitly before any
:class:`.Table` that refers to it, which breaks in the case when the
sequence is also involved in a server-side default for that table, when
using :meth:`.MetaData.drop_all`. The step which processes sequences
to be dropped via non server-side column default functions is now invoked
after the table itself is dropped.
Change-Id: I185f2cc76d2011ad4dd3ba9bde5d8aef0ec335ae
Fixes: #4300
Diffstat (limited to 'test/sql')
| -rw-r--r-- | test/sql/test_defaults.py | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/test/sql/test_defaults.py b/test/sql/test_defaults.py index 0d4eecf6a..42514a927 100644 --- a/test/sql/test_defaults.py +++ b/test/sql/test_defaults.py @@ -17,6 +17,7 @@ from sqlalchemy.util import u, b 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 @@ -1312,6 +1313,85 @@ class TableBoundSequenceTest(fixtures.TestBase): (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. |
