Narven
Triplex with transactions always returns error on migrate
Hi,
For the last 2 days, I’ve be trying to implement Triplex to add multi-tenancy to my application, and I use transactions a lot, usually with Ecto.Multi.
From the documentation it looks like with triplex I need to use:
Triplex.create_schema(slug, Project.Repo, fn(tenant, repo) ->
Repo.transaction(fn ->
mig = Triplex.migrate(tenant, repo)
IO.inspect(mig, label: "MIGRATE")
// Add any ecto operation here...
tenant
end)
end)
My problem is that Triplex.migrate(tenant, repo) is always, always returning:
{:error,
"ERROR 42P01 (undefined_table) relation \"prj_c24.schema_migrations\" does not exist\n\n query: INSERT INTO \"prj_c24\".\"schema_migrations\" (\"version\",\"inserted_at\") VALUES ($1,$2)"}
For me this is an extreme confusing error. It tells nothing about what is happening, (at least for me).
My only migration is this:
defmodule Project.Repo.Migrations.CreateUsersTables do
use Ecto.Migration
def change do
# execute "CREATE EXTENSION IF NOT EXISTS citext", ""
create table(:users, primary_key: false) do
add(:id, :uuid, primary_key: true, null: false)
# add(:email, :citext, null: false)
add(:hashed_password, :string, null: false)
add(:first_name, :string, null: false)
add(:last_name, :string, null: false)
add(:is_enabled, :boolean, null: false, default: true)
add(:dob, :date)
add(:photo, :string, default: "/images/empty.png")
add(:confirmed_at, :naive_datetime)
timestamps()
end
# create unique_index(:users, [:email])
end
end
Any help on that error? thanks
PS: The prefix is being created in the database. But migrations are not running.
❯ elixir --version
Erlang/OTP 24 [erts-12.1.5] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit] [dtrace]
Elixir 1.13.0 (compiled with Erlang/OTP 24)
{:triplex, "~> 1.3.0-rc.1"}
Marked As Solved
al2o3cr
Yeah, that’s what makes me suspicious about the Repo.transaction in the middle - Triplex.create is defined in a way that’s equivalent to:
Triplex.create_schema(slug, Project.Repo, fn(tenant, repo) ->
Triplex.migrate(tenant, repo)
end)
Re: your last message about running inside a migration - if this code is inside a migration’s def up, then there’s already a transaction wrapped around the whole thing. You may need to disable that with @disable_ddl_transaction true.
Also Liked
riebeekn
I think the inner transaction is the issue. As mentionned in the Triplex docs the way migrations run was changed in Ecto 3. Since that change I haven’t ever been able to get Triplex.migrate to run within a transaction. Considering create_schema will do a schema drop on any {:error, some_err_message} result… not using a transaction seems an alright way of going about things.
So I would try something along the lines of:
Triplex.create_schema(slug, Repo, fn tenant, repo ->
{:ok, _} = Triplex.migrate(tenant, repo)
Repo.transaction(fn ->
# do other inserts etc. here... such as...
with {:ok, user} <- insert_some_default_user_on_schema_creation(),
{:ok, _something_else} <- do_something_else() do
{:ok, user}
else
{:error, error} ->
Repo.rollback(error)
end
end)
end)
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance








