Merge "Fix wrong migrations"

This commit is contained in:
Jenkins
2013-09-05 13:41:51 +00:00
committed by Gerrit Code Review
2 changed files with 41 additions and 30 deletions

View File

@@ -32,13 +32,13 @@ from alembic import op
TABLE_NAME = 'sourceassoc' TABLE_NAME = 'sourceassoc'
OLD_NAME = 'uniq_sourceassoc0meter_id' UNIQ_NAME = 'uniq_sourceassoc0meter_id0user_id'
NEW_NAME = 'uniq_sourceassoc0meter_id0user_id'
COLUMNS = ('meter_id', 'user_id') COLUMNS = ('meter_id', 'user_id')
def change_uniq(table_name, old_name, new_name, columns): def change_uniq(table_name, uniq_name, columns, downgrade=False):
engine = op.get_bind().engine bind = op.get_bind()
engine = bind.engine
if engine.name == 'sqlite': if engine.name == 'sqlite':
return return
if engine.name == 'mysql': if engine.name == 'mysql':
@@ -50,12 +50,10 @@ def change_uniq(table_name, old_name, new_name, columns):
op.drop_constraint('fk_sourceassoc_user_id', op.drop_constraint('fk_sourceassoc_user_id',
table_name, table_name,
type_='foreignkey') type_='foreignkey')
try: if downgrade:
# For some versions of dialects constraint can be skipped. op.drop_constraint(uniq_name, table_name=table_name, type_='unique')
op.drop_constraint(old_name, table_name=table_name, type_='unique') else:
except Exception: op.create_unique_constraint(uniq_name, table_name, columns)
pass
op.create_unique_constraint(new_name, table_name, columns)
if engine.name == 'mysql': if engine.name == 'mysql':
op.create_foreign_key('fk_sourceassoc_meter_id', table_name, 'meter', op.create_foreign_key('fk_sourceassoc_meter_id', table_name, 'meter',
['meter_id'], ['id']) ['meter_id'], ['id'])
@@ -64,8 +62,8 @@ def change_uniq(table_name, old_name, new_name, columns):
def upgrade(): def upgrade():
change_uniq(TABLE_NAME, OLD_NAME, NEW_NAME, COLUMNS) change_uniq(TABLE_NAME, UNIQ_NAME, COLUMNS)
def downgrade(): def downgrade():
change_uniq(TABLE_NAME, NEW_NAME, OLD_NAME, COLUMNS) change_uniq(TABLE_NAME, UNIQ_NAME, COLUMNS, downgrade=True)

View File

@@ -29,53 +29,66 @@ revision = 'b6ae66d05e3'
down_revision = '17738166b91' down_revision = '17738166b91'
from alembic import op from alembic import op
import sqlalchemy as sa
INDEXES = ( INDEXES = (
# ([dialects], table_name, index_name, create/delete, uniq/not uniq) # ([dialects], table_name, index_name, create/delete, uniq/not_uniq,
# length_limited)
(['mysql', 'sqlite', 'postgresql'], (['mysql', 'sqlite', 'postgresql'],
'resource', 'resource',
'resource_user_id_project_id_key', 'resource_user_id_project_id_key',
('user_id', 'project_id'), True, False), ('user_id', 'project_id'), True, False, True),
(['mysql'], 'source', 'id', ('id',), False, True)) (['mysql'], 'source', 'id', ('id',), False, True, False))
def index_cleanup(engine_names, table_name, uniq_name, columns, create=True, def index_cleanup(engine_names, table_name, uniq_name, columns, create,
unique=False): unique, limited):
engine = op.get_bind().engine bind = op.get_bind()
engine = bind.engine
if engine.name not in engine_names: if engine.name not in engine_names:
return return
if create: if create:
# We have unique constraint in postgres for `resource` table. if limited and engine.name == 'mysql':
# But it should be a simple index. So, we should delete unique key # For some versions of mysql we can get an error
# before index creation. # "Specified key was too long; max key length is 1000 bytes".
if engine.name == 'postgresql': # We should create an index by hand in this case with limited
op.drop_constraint(uniq_name, table_name, type_='unique') # length of columns.
meta = sa.MetaData()
meta.bind = engine
table = sa.Table(table_name, meta, autoload=True)
columns_mysql = ",".join((c + "(100)" for c in columns))
sql = ("create index %s ON %s (%s)" % (uniq_name, table,
columns_mysql))
engine.execute(sql)
else:
op.create_index(uniq_name, table_name, columns, unique=unique) op.create_index(uniq_name, table_name, columns, unique=unique)
else: else:
if unique: if unique:
op.drop_constraint(uniq_name, table_name, type_='unique') op.drop_constraint(uniq_name, table_name, type_='unique')
else: else:
op.drop_index(uniq_name, table_name=table_name) op.drop_index(uniq_name, table_name=table_name)
if engine.name == 'postgresql':
op.create_unique_constraint(uniq_name, table_name, columns)
def upgrade(): def upgrade():
for engine_names, table_name, uniq_name, columns, create, uniq in INDEXES: for (engine_names, table_name, uniq_name, columns, create, uniq,
limited) in INDEXES:
index_cleanup(engine_names, index_cleanup(engine_names,
table_name, table_name,
uniq_name, uniq_name,
columns, columns,
create, create,
uniq) uniq,
limited)
def downgrade(): def downgrade():
for engine_names, table_name, uniq_name, columns, create, uniq in INDEXES: for (engine_names, table_name, uniq_name, columns, create, uniq,
limited) in INDEXES:
index_cleanup(engine_names, index_cleanup(engine_names,
table_name, table_name,
uniq_name, uniq_name,
columns, columns,
not create, not create,
uniq) uniq,
limited)