From 9a66c1860c668b71c07f526770ed2c560a0bedb9 Mon Sep 17 00:00:00 2001 From: Malte Rohde Date: Wed, 6 Dec 2023 13:31:59 +0100 Subject: [PATCH] Handle missing schemas in ensure_up! We noticed that `c:Migrator.ensure_up!/0` does not check for existence of schemas before calling `Ecto.Migrator.migrations/3`, which unfortunately terminates with a rather cryptic error. This PR fixes that by explicitly checking schema existence before calling `migrations/3`. Opted for only checking (instead of creating it) to keep `ensure_up!/0`'s behaviour "read-only". --- lib/bitcrowd_ecto/migrator.ex | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/lib/bitcrowd_ecto/migrator.ex b/lib/bitcrowd_ecto/migrator.ex index d136c76..3bfab80 100644 --- a/lib/bitcrowd_ecto/migrator.ex +++ b/lib/bitcrowd_ecto/migrator.ex @@ -215,10 +215,19 @@ defmodule BitcrowdEcto.Migrator do end defp down_tenant_migrations(repo) do + for tenant <- repo.known_prefixes() do + if schema_exists?(repo, tenant) do + down_tenant_migrations(repo, tenant) + else + ["SCHEMA DOES NOT EXIST: #{tenant}"] + end + end + end + + defp down_tenant_migrations(repo, tenant) do path = tenant_migrations_path(repo) - for tenant <- repo.known_prefixes(), - {:down, prefix, name} <- Migrator.migrations(repo, [path], prefix: tenant) do + for {:down, prefix, name} <- Migrator.migrations(repo, [path], prefix: tenant) do "#{prefix}_#{name} (tenant: #{tenant})" end end @@ -286,8 +295,12 @@ defmodule BitcrowdEcto.Migrator do SELECT 1 FROM information_schema.schemata WHERE schema_name = $1; """ + defp schema_exists?(repo, tenant) do + match?(%{rows: [[1]]}, SQL.query!(repo, @exists_query, [tenant])) + end + defp ensure_schema!(repo, tenant) do - unless match?(%{rows: [[1]]}, SQL.query!(repo, @exists_query, [tenant])) do + unless schema_exists?(repo, tenant) do SQL.query!(repo, ~s(CREATE SCHEMA "#{tenant}"), []) end end