Bandera.Ecto.Migrations (bandera v0.4.0)

Copy Markdown View Source

Helpers for creating the Bandera flags table. Call from your own migration:

defmodule MyApp.Repo.Migrations.CreateBanderaFlags do
  use Ecto.Migration
  def up, do: Bandera.Ecto.Migrations.up()
  def down, do: Bandera.Ecto.Migrations.down()
end

The table name is read at runtime from config :bandera, persistence: [ecto_table_name: ...] (default "bandera_flags"), so it is never fixed at compile time.

Summary

Functions

Drops the flags table. Call from the down/0 of your own migration.

Fixes boolean gate rows left by a FunWithFlags-to-Bandera migration.

Creates the flags table and its unique index (idempotently).

Add the schema-v2 value column to an existing flags table.

Functions

down()

@spec down() :: :ok

Drops the flags table. Call from the down/0 of your own migration.

fix_fun_with_flags_boolean_gates()

@spec fix_fun_with_flags_boolean_gates() :: :ok

Fixes boolean gate rows left by a FunWithFlags-to-Bandera migration.

FunWithFlags stored boolean gates with a legacy target value; Bandera uses "_bandera_none". Because the Ecto adapter's upsert conflict target is (flag_name, gate_type, target), toggling a flag via Bandera after migration inserts a second boolean row rather than updating the legacy one. This leaves two rows with contradictory enabled values, causing the dashboard toggle and summary to disagree and making the toggle appear broken.

Run once from a migration after switching to Bandera:

defmodule MyApp.Repo.Migrations.FixFunWithFlagsBooleanGates do
  use Ecto.Migration
  def up, do: Bandera.Ecto.Migrations.fix_fun_with_flags_boolean_gates()
  def down, do: :ok
end

Safe to run on a database that has already been fully migrated — it will find nothing to change. Not reversible (down should be a no-op).

up()

@spec up() :: :ok

Creates the flags table and its unique index (idempotently).

Call from the up/0 of your own migration. The table name is read at runtime from Bandera.Config.ecto_table_name/0.

upgrade_v2()

@spec upgrade_v2() :: :ok

Add the schema-v2 value column to an existing flags table.

Call once from the up/0 of a versioned migration in an existing install:

defmodule MyApp.Repo.Migrations.UpgradeBanderaV2 do
  use Ecto.Migration
  def up, do: Bandera.Ecto.Migrations.upgrade_v2()
end

Uses a plain add/2 (not add_if_not_exists/2) so it works on adapters such as SQLite3 that reject conditional column additions; migration versioning ensures it runs only once.