Skip to content

Commit

Permalink
Modified the migration function to to automatically detect the the fo…
Browse files Browse the repository at this point in the history
…reign keys based on the signature.

It supports also sqlite using batch migrations
  • Loading branch information
Luca Albertalli committed Jun 1, 2016
1 parent 1650138 commit 938f6cd
Showing 1 changed file with 31 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,38 @@
from alembic import op
import sqlalchemy as sa

naming_convention = {
"fk":
"fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
}

def find_constraint_name(upgrade = True):
__table = 'columns'
__cols = {'column_name'} if upgrade else {'datasource_name'}
__referenced = 'datasources'
__ref_cols = {'datasource_name'} if upgrade else {'column_name'}

engine = op.get_bind().engine
m = sa.MetaData({})
t=sa.Table(__table,m, autoload=True, autoload_with=engine)

for fk in t.foreign_key_constraints:
if fk.referred_table.name == __referenced and \
set(fk.column_keys) == __cols:
return fk.name
return None

def upgrade():
op.drop_constraint('columns_ibfk_1', 'columns', type_="foreignkey")
op.create_foreign_key('columns_ibfk_1', 'columns', 'datasources', ['datasource_name'], ['datasource_name'])

constraint = find_constraint_name() or 'fk_columns_column_name_datasources'
with op.batch_alter_table("columns",
naming_convention=naming_convention) as batch_op:
batch_op.drop_constraint(constraint, type_="foreignkey")
batch_op.create_foreign_key('fk_columns_datasource_name_datasources', 'datasources', ['datasource_name'], ['datasource_name'])

def downgrade():
op.drop_constraint('columns_ibfk_1', 'columns', type_="foreignkey")
op.create_foreign_key('columns_ibfk_1', 'columns', 'datasources', ['columns'], ['datasource_name'])
constraint = find_constraint_name(False) or 'fk_columns_datasource_name_datasources'
with op.batch_alter_table("columns",
naming_convention=naming_convention) as batch_op:
batch_op.drop_constraint(constraint, type_="foreignkey")
batch_op.create_foreign_key('fk_columns_column_name_datasources', 'datasources', ['column_name'], ['datasource_name'])

0 comments on commit 938f6cd

Please sign in to comment.