def METHOD_NAME():
    bind = op.get_bind()
    insp = sa.engine.reflection.Inspector.from_engine(bind)
    # Add the new less restrictive uniqueness constraint.
    with op.batch_alter_table("datasources", naming_convention=conv) as batch_op:
        batch_op.create_unique_constraint(
            "uq_datasources_cluster_name", ["cluster_name", "datasource_name"]
        )
    # Augment the tables which have a foreign key constraint related to the
    # datasources.datasource_name column.
    for foreign in ["columns", "metrics"]:
        with op.batch_alter_table(foreign, naming_convention=conv) as batch_op:
            # Add the datasource_id column with the relevant constraints.
            batch_op.add_column(sa.Column("datasource_id", sa.Integer))
            batch_op.create_foreign_key(
                f"fk_{foreign}_datasource_id_datasources",
                "datasources",
                ["datasource_id"],
                ["id"],
            )
        # Helper table for database migration using minimal schema.
        table = sa.Table(
            foreign,
            sa.MetaData(),
            sa.Column("id", sa.Integer, primary_key=True),
            sa.Column("datasource_name", sa.String(255)),
            sa.Column("datasource_id", sa.Integer),
        )
        # Migrate the existing data.
        for datasource in bind.execute(datasources.select()):
            bind.execute(
                table.update()
                .where(table.c.datasource_name == datasource.datasource_name)
                .values(datasource_id=datasource.id)
            )
        with op.batch_alter_table(foreign, naming_convention=conv) as batch_op:
            # Drop the datasource_name column and associated constraints. Note
            # due to prior revisions (1226819ee0e3, 3b626e2a6783) there may
            # incorrectly be multiple duplicate constraints.
            names = generic_find_fk_constraint_names(
                foreign, {"datasource_name"}, "datasources", insp
            )
            for name in names:
                batch_op.drop_constraint(
                    name or f"fk_{foreign}_datasource_name_datasources",
                    type_="foreignkey",
                )
            batch_op.drop_column("datasource_name")
    try:
        # Drop the old more restrictive uniqueness constraint.
        with op.batch_alter_table("datasources", naming_convention=conv) as batch_op:
            batch_op.drop_constraint(
                generic_find_uq_constraint_name(
                    "datasources", {"datasource_name"}, insp
                )
                or "uq_datasources_datasource_name",
                type_="unique",
            )
    except Exception as ex:
        logging.warning(
            "Constraint drop failed, you may want to do this "
            "manually on your database. For context, this is a known "
            "issue around nondeterministic constraint names on Postgres "
            "and perhaps more databases through SQLAlchemy."
        )
        logging.exception(ex)