Versioned migrations for SquatchMail's database tables.
SquatchMail keeps its tables isolated in their own Postgres schema (the
:prefix, "squatch_mail" by default) inside the host application's database.
Rather than shipping raw, hand-editable migrations, all schema changes are
applied through this single, versioned entrypoint — the same pattern used by
Oban and ErrorTracker.
Usage
The host application generates one migration that delegates here:
defmodule MyApp.Repo.Migrations.AddSquatchMail do
use Ecto.Migration
def up, do: SquatchMail.Migrations.up()
def down, do: SquatchMail.Migrations.down()
endThen runs it with mix ecto.migrate. Later SquatchMail releases add new
versions; the host generates another migration pinned to a version:
def up, do: SquatchMail.Migrations.up(version: 2)
def down, do: SquatchMail.Migrations.down(version: 1)Options
:prefix- the Postgres schema to create the tables in. Defaults toSquatchMail.Config.prefix/0("squatch_mail").:version- the version to migrate to. Defaults to the latest version.:create_schema- whether toCREATE SCHEMA IF NOT EXISTSfor the prefix. Defaults totrue. Set tofalsewhen the schema is managed externally or when the prefix is"public".
The applied version is tracked as a COMMENT on the emails table (mirroring
Oban, which comments oban_jobs), so re-running up/1 is idempotent and only
the outstanding versions run.
Summary
Functions
Rolls SquatchMail's tables back down to the given version (default 0).
Returns the currently-migrated version for the given prefix (0 if none).
Migrates SquatchMail's tables up to the given (or latest) version.
Functions
@spec down(Keyword.t()) :: :ok
Rolls SquatchMail's tables back down to the given version (default 0).
@spec migrated_version(Keyword.t()) :: non_neg_integer()
Returns the currently-migrated version for the given prefix (0 if none).
@spec up(Keyword.t()) :: :ok
Migrates SquatchMail's tables up to the given (or latest) version.