def upgrade(migrate_engine): meta = MetaData(bind=migrate_engine) resource_providers = Table('resource_providers', meta, autoload=True) name = Column('name', Unicode(200), nullable=True) generation = Column('generation', Integer, default=0) can_host = Column('can_host', Integer, default=0) if not hasattr(resource_providers.c, 'name'): # NOTE(cdent): The resource_providers table is defined as # latin1 to be more efficient. Now we need the name column # to be UTF8. First create the column, then modify it, # otherwise the declarative handling in sqlalchemy gets # confused. resource_providers.create_column(name) if migrate_engine.name == 'mysql': name_col_ddl = DDL("ALTER TABLE resource_providers MODIFY name " "VARCHAR(200) CHARACTER SET utf8") conn = migrate_engine.connect() conn.execute(name_col_ddl) uc = UniqueConstraint('name', table=resource_providers, name='uniq_resource_providers0name') uc.create() # DB2 automatically creates an index for the unique # constraint above, so skip adding the index on DB2. if migrate_engine.name != 'ibm_db_sa': utils.add_index(migrate_engine, 'resource_providers', 'resource_providers_name_idx', ['name']) if not hasattr(resource_providers.c, 'generation'): resource_providers.create_column(generation) if not hasattr(resource_providers.c, 'can_host'): resource_providers.create_column(can_host) resource_provider_aggregates = Table('resource_provider_aggregates', meta, Column('resource_provider_id', Integer, primary_key=True, nullable=False), Column('aggregate_id', Integer, primary_key=True, nullable=False), mysql_engine='InnoDB', mysql_charset='latin1') Index('resource_provider_aggregates_aggregate_id_idx', resource_provider_aggregates.c.aggregate_id) resource_provider_aggregates.create(checkfirst=True) utils.add_index(migrate_engine, 'allocations', 'allocations_resource_provider_class_used_idx', ['resource_provider_id', 'resource_class_id', 'used']) utils.drop_index(migrate_engine, 'allocations', 'allocations_resource_provider_class_id_idx') # Add a unique constraint so that any resource provider can have # only one inventory for any given resource class. inventories = Table('inventories', meta, autoload=True) inventories_uc = UniqueConstraint( 'resource_provider_id', 'resource_class_id', table=inventories, name='uniq_inventories0resource_provider_resource_class') inventories_uc.create() if migrate_engine.name != 'ibm_db_sa': utils.add_index(migrate_engine, 'inventories', 'inventories_resource_provider_resource_class_idx', ['resource_provider_id', 'resource_class_id'])
def ensure_index_removed(migrate_engine, table_name, index_name): if utils.index_exists(migrate_engine, table_name, index_name): utils.drop_index(migrate_engine, table_name, index_name)
def test_drop_index(self): Index('new_index', self.test_table.c.a).create(self.engine) utils.drop_index(self.engine, 'test_table', 'new_index') self.assertFalse(utils.index_exists(self.engine, 'test_table', 'new_index'))
def upgrade(migrate_engine): meta = MetaData(bind=migrate_engine) resource_providers = Table('resource_providers', meta, autoload=True) name = Column('name', Unicode(200), nullable=True) generation = Column('generation', Integer, default=0) can_host = Column('can_host', Integer, default=0) if not hasattr(resource_providers.c, 'name'): # NOTE(cdent): The resource_providers table is defined as # latin1 to be more efficient. Now we need the name column # to be UTF8. First create the column, then modify it, # otherwise the declarative handling in sqlalchemy gets # confused. resource_providers.create_column(name) if migrate_engine.name == 'mysql': name_col_ddl = DDL( "ALTER TABLE resource_providers MODIFY name " "VARCHAR(200) CHARACTER SET utf8") conn = migrate_engine.connect() conn.execute(name_col_ddl) uc = UniqueConstraint('name', table=resource_providers, name='uniq_resource_providers0name') uc.create() utils.add_index(migrate_engine, 'resource_providers', 'resource_providers_name_idx', ['name']) if not hasattr(resource_providers.c, 'generation'): resource_providers.create_column(generation) if not hasattr(resource_providers.c, 'can_host'): resource_providers.create_column(can_host) resource_provider_aggregates = Table( 'resource_provider_aggregates', meta, Column('resource_provider_id', Integer, primary_key=True, nullable=False), Column('aggregate_id', Integer, primary_key=True, nullable=False), mysql_engine='InnoDB', mysql_charset='latin1' ) Index('resource_provider_aggregates_aggregate_id_idx', resource_provider_aggregates.c.aggregate_id) resource_provider_aggregates.create(checkfirst=True) utils.add_index(migrate_engine, 'allocations', 'allocations_resource_provider_class_used_idx', ['resource_provider_id', 'resource_class_id', 'used']) utils.drop_index(migrate_engine, 'allocations', 'allocations_resource_provider_class_id_idx') # Add a unique constraint so that any resource provider can have # only one inventory for any given resource class. inventories = Table('inventories', meta, autoload=True) inventories_uc = UniqueConstraint( 'resource_provider_id', 'resource_class_id', table=inventories, name='uniq_inventories0resource_provider_resource_class') inventories_uc.create() utils.add_index(migrate_engine, 'inventories', 'inventories_resource_provider_resource_class_idx', ['resource_provider_id', 'resource_class_id'])