Merge "Fix wrong migrations"
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user