def drop(self): """ Remove version control from a database. """ if SQLA_07: try: self.table.drop() except sa_exceptions.DatabaseError: raise exceptions.DatabaseNotControlledError(str(self.table)) else: try: self.table.drop() except (sa_exceptions.SQLError): raise exceptions.DatabaseNotControlledError(str(self.table))
def test_db_version_init_race(self, mock_get_engine, mock_db_version, mock_find_repo): # This test exercises bug 1804652 by causing # versioning_api.version_contro() to raise an unhandleable error the # first time it is called. database = 'api' mock_get_engine.return_value = 'engine' exc = versioning_exceptions.DatabaseNotControlledError() mock_db_version.side_effect = [exc, ''] metadata = mock.MagicMock() metadata.tables.return_value = [] with mock.patch.object(sqlalchemy, 'MetaData', metadata), mock.patch.object(migration, 'db_version_control') as mock_version_control: # db_version_control raises an unhandleable error because we were # racing to initialise with another process. mock_version_control.side_effect = test.TestingException migration.db_version(database) mock_version_control.assert_called_once_with(0, database, context=None) db_version_calls = [mock.call('engine', 'repo')] * 2 self.assertEqual(db_version_calls, mock_db_version.call_args_list) engine_calls = [mock.call(database, context=None)] * 3 self.assertEqual(engine_calls, mock_get_engine.call_args_list)
def test__is_database_under_migrate_control__false(self, mock_db_version): mock_db_version.side_effect = \ migrate_exceptions.DatabaseNotControlledError() ret = migration._is_database_under_migrate_control('engine', 'repo') self.assertFalse(ret) mock_db_version.assert_called_once_with('engine', 'repo')
def test_db_version_raise_not_controlled_error_tables(self): with mock.patch.object(sqlalchemy, 'MetaData') as mock_meta: self.mock_api_db_version.side_effect = \ migrate_exception.DatabaseNotControlledError('oups') my_meta = mock.MagicMock() my_meta.tables = {'a': 1, 'b': 2} mock_meta.return_value = my_meta self.assertRaises(db_exception.DbMigrationError, migration.db_version, self.engine, self.path, self.init_version)
def test_db_version_raise_not_controlled_error_no_tables(self, mock_vc): with mock.patch.object(sqlalchemy, 'MetaData') as mock_meta: self.mock_api_db_version.side_effect = ( migrate_exception.DatabaseNotControlledError('oups'), self.init_version) my_meta = mock.MagicMock() my_meta.tables = {} mock_meta.return_value = my_meta migration.db_version(self.engine, self.path, self.init_version) mock_vc.assert_called_once_with(self.engine, self.return_value1, self.init_version)
def test_db_version_raise_not_controlled_error_first(self): with mock.patch.object(migration, 'db_version_control') as mock_ver: self.mock_api_db_version.side_effect = [ migrate_exception.DatabaseNotControlledError('oups'), self.test_version] ret_val = migration.db_version(self.engine, self.path, self.init_version) self.assertEqual(self.test_version, ret_val) mock_ver.assert_called_once_with(self.engine, self.path, version=self.init_version)
def test_db_version_raise_not_controlled_migrate_tables(self, mock_vc): # When there are tables but the sqlalchemy-migrate control table # (migrate_version) is present, attempt to version the db. # This simulates the case where there is are multiple repos (different # abs_paths) and a different path has been versioned already. with mock.patch.object(sqlalchemy, 'MetaData') as mock_meta: self.mock_api_db_version.side_effect = [ migrate_exception.DatabaseNotControlledError('oups'), None] my_meta = mock.MagicMock() my_meta.tables = {'migrate_version': 1, 'b': 2} mock_meta.return_value = my_meta migration.db_version(self.engine, self.path, self.init_version) mock_vc.assert_called_once_with(self.engine, self.return_value1, self.init_version)
def test_not_controlled(self, mock_get_engine, mock_db_version, mock_find_repo): database = 'api' mock_get_engine.side_effect = ['engine', 'engine', 'engine'] exc = versioning_exceptions.DatabaseNotControlledError() mock_db_version.side_effect = [exc, ''] metadata = mock.MagicMock() metadata.tables.return_value = [] with mock.patch.object( sqlalchemy, 'MetaData', metadata), mock.patch.object( migration, 'db_version_control') as mock_version_control: migration.db_version(database) mock_version_control.assert_called_once_with(0, database) db_version_calls = [mock.call('engine', 'repo')] * 2 self.assertEqual(db_version_calls, mock_db_version.call_args_list) engine_calls = [mock.call(database)] * 3 self.assertEqual(engine_calls, mock_get_engine.call_args_list)
def load(self): """Load controlled schema version info from DB""" tname = self.repository.version_table try: if not hasattr(self, 'table') or self.table is None: self.table = Table(tname, self.meta, autoload=True) result = self.engine.execute( self.table.select( self.table.c.repository_id == str(self.repository.id))) data = list(result)[0] except: cls, exc, tb = sys.exc_info() six.reraise(exceptions.DatabaseNotControlledError, exceptions.DatabaseNotControlledError(str(exc)), tb) self.version = data['version'] return data