Uni Ecto Plugin ★ Simple
defmodule MyApp.Repo do use Ecto.Repo, otp_app: :my_app use UniEcto.Plugin, prefix_key: :tenant_prefix def all_tenants do # Could be a DB query or a static list ["public", "tenant_customer_a", "tenant_customer_b"] end end Step 3: Generate the Tenant Migrations The plugin usually provides a generator:
It transforms Ecto from a simple ORM into a . While the initial setup requires more thought than a standard Ecto setup—specifically around migrations and the plug pipeline—the long-term benefits in security, data integrity, and scalability are immense. uni ecto plugin
In the modern landscape of Software as a Service (SaaS), multi-tenancy is no longer a luxury—it’s a necessity. Whether you are building a white-label CRM, an enterprise ERP, or a simple API for startups, you need a way to isolate customer data securely. defmodule MyApp
defp deps do [ :ecto_sql, "~> 3.0", :uni_ecto_plugin, "~> 0.5.0", # Hypothetical version :postgrex, ">= 0.0.0" ] end Run mix deps.get . The plugin requires you to use its TenantRepo behaviour. Modify your lib/my_app/repo.ex : Whether you are building a white-label CRM, an
def list_users_raw do prefix = UniEcto.Plugin.get_tenant_prefix() Repo.query("SELECT * FROM #prefix.users") end What if your Settings table is global and Orders is per-tenant?
defmodule MyApp.Repo.Migrations.AddNotesToOrders do use Ecto.Migration import UniEcto.MigrationHelpers def up do # Runs on all existing tenants + public for tenant <- UniEcto.Plugin.all_tenants() do execute("SET search_path TO #tenant") alter table(:orders) do add :notes, :text end end end end