diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2019-08-06 16:10:09 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2019-08-06 23:11:54 -0400 |
| commit | d8da7f5ac544f3dd853a221faa5fab4ff788e25b (patch) | |
| tree | 0ec2fa102695a107eb799ed12c4ade60e84a8790 /test/sql | |
| parent | 6a622c636ca5bc55d96b92652fd43b914a77645c (diff) | |
| download | sqlalchemy-d8da7f5ac544f3dd853a221faa5fab4ff788e25b.tar.gz | |
Implement checkfirst for Index.create(), Index.drop()
The :meth:`.Index.create` and :meth:`.Index.drop` methods now have a
parameter :paramref:`.Index.create.checkfirst`, in the same way as that of
:class:`.Table` and :class:`.Sequence`, which when enabled will cause the
operation to detect if the index exists (or not) before performing a create
or drop operation.
Fixes: #527
Change-Id: Idf994bc016359d0ae86cc64ccb20378115cb66d6
Diffstat (limited to 'test/sql')
| -rw-r--r-- | test/sql/test_ddlemit.py | 118 |
1 files changed, 117 insertions, 1 deletions
diff --git a/test/sql/test_ddlemit.py b/test/sql/test_ddlemit.py index 3cdbfaecc..13300f0b5 100644 --- a/test/sql/test_ddlemit.py +++ b/test/sql/test_ddlemit.py @@ -1,5 +1,6 @@ from sqlalchemy import Column from sqlalchemy import ForeignKey +from sqlalchemy import Index from sqlalchemy import Integer from sqlalchemy import MetaData from sqlalchemy import schema @@ -16,11 +17,15 @@ class EmitDDLTest(fixtures.TestBase): def has_item(connection, name, schema): return item_exists(name) + def has_index(connection, tablename, idxname, schema): + return item_exists(idxname) + return Mock( dialect=Mock( supports_sequences=True, has_table=Mock(side_effect=has_item), has_sequence=Mock(side_effect=has_item), + has_index=Mock(side_effect=has_index), supports_comments=True, inline_comments=False, ) @@ -86,6 +91,12 @@ class EmitDDLTest(fixtures.TestBase): t2 = Table("t2", m, Column("id", Integer, primary_key=True)) return m, t1, t2 + def _table_index_fixture(self): + m = MetaData() + t1 = Table("t1", m, Column("x", Integer), Column("y", Integer)) + i1 = Index("my_idx", t1.c.x, t1.c.y) + return m, t1, i1 + def _table_seq_fixture(self): m = MetaData() @@ -130,6 +141,105 @@ class EmitDDLTest(fixtures.TestBase): self._assert_drop([t1, s1], generator, m) + def test_create_table_index_checkfirst(self): + """create table that doesn't exist should not require a check + on the index""" + + m, t1, i1 = self._table_index_fixture() + + def exists(name): + if name == "my_idx": + raise NotImplementedError() + else: + return False + + generator = self._mock_create_fixture(True, [t1], item_exists=exists) + self._assert_create([t1, i1], generator, t1) + + def test_create_table_exists_index_checkfirst(self): + """for the moment, if the table *does* exist, we are not checking + for the index. this can possibly be changed.""" + + m, t1, i1 = self._table_index_fixture() + + def exists(name): + if name == "my_idx": + raise NotImplementedError() + else: + return True + + generator = self._mock_create_fixture(True, [t1], item_exists=exists) + # nothing is created + self._assert_create([], generator, t1) + + def test_drop_table_index_checkfirst(self): + m, t1, i1 = self._table_index_fixture() + + def exists(name): + if name == "my_idx": + raise NotImplementedError() + else: + return True + + generator = self._mock_drop_fixture(True, [t1], item_exists=exists) + self._assert_drop_tables([t1], generator, t1) + + def test_create_index_checkfirst_exists(self): + m, t1, i1 = self._table_index_fixture() + generator = self._mock_create_fixture( + True, [i1], item_exists=lambda idx: True + ) + self._assert_create_index([], generator, i1) + + def test_create_index_checkfirst_doesnt_exist(self): + m, t1, i1 = self._table_index_fixture() + generator = self._mock_create_fixture( + True, [i1], item_exists=lambda idx: False + ) + self._assert_create_index([i1], generator, i1) + + def test_create_index_nocheck_exists(self): + m, t1, i1 = self._table_index_fixture() + generator = self._mock_create_fixture( + False, [i1], item_exists=lambda idx: True + ) + self._assert_create_index([i1], generator, i1) + + def test_create_index_nocheck_doesnt_exist(self): + m, t1, i1 = self._table_index_fixture() + generator = self._mock_create_fixture( + False, [i1], item_exists=lambda idx: False + ) + self._assert_create_index([i1], generator, i1) + + def test_drop_index_checkfirst_exists(self): + m, t1, i1 = self._table_index_fixture() + generator = self._mock_drop_fixture( + True, [i1], item_exists=lambda idx: True + ) + self._assert_drop_index([i1], generator, i1) + + def test_drop_index_checkfirst_doesnt_exist(self): + m, t1, i1 = self._table_index_fixture() + generator = self._mock_drop_fixture( + True, [i1], item_exists=lambda idx: False + ) + self._assert_drop_index([], generator, i1) + + def test_drop_index_nocheck_exists(self): + m, t1, i1 = self._table_index_fixture() + generator = self._mock_drop_fixture( + False, [i1], item_exists=lambda idx: True + ) + self._assert_drop_index([i1], generator, i1) + + def test_drop_index_nocheck_doesnt_exist(self): + m, t1, i1 = self._table_index_fixture() + generator = self._mock_drop_fixture( + False, [i1], item_exists=lambda idx: False + ) + self._assert_drop_index([i1], generator, i1) + def test_create_collection_checkfirst(self): m, t1, t2, t3, t4, t5 = self._table_fixture() generator = self._mock_create_fixture( @@ -240,7 +350,7 @@ class EmitDDLTest(fixtures.TestBase): def _assert_create(self, elements, generator, argument): self._assert_ddl( - (schema.CreateTable, schema.CreateSequence), + (schema.CreateTable, schema.CreateSequence, schema.CreateIndex), elements, generator, argument, @@ -282,6 +392,12 @@ class EmitDDLTest(fixtures.TestBase): argument, ) + def _assert_create_index(self, elements, generator, argument): + self._assert_ddl((schema.CreateIndex,), elements, generator, argument) + + def _assert_drop_index(self, elements, generator, argument): + self._assert_ddl((schema.DropIndex,), elements, generator, argument) + def _assert_ddl(self, ddl_cls, elements, generator, argument): generator.traverse_single(argument) for call_ in generator.connection.execute.mock_calls: |
