johnnyicon
Referencing Another Schema During Migration for Foreign-Key Relationship
Hi all,
We are working with a schema-based multi-tenancy database. We are on an Elixir stack, using Postgres, Ecto, and Triplex within a Phoenix Framework project.
We are using the default schema public to store common data, such as users and organisations. In particular, we have within the Organisations table a tenant_prefix column which we use to map a user to their tenancy.
Within a tenancy, we tenant-specific tables. As an example, we have a Products table. When a new organisation is created, we use Triplex to create the schema and run tenant migrations, which create the tenant specific tables such as Products.
As a visual, the database looks like this:
- app_database
- public
- users
- organisations
- organisations_users
- tenant1
- products
- (other tables...)
- tenant2
- products
- (other tables...)
The Products migration looks like this.
1 defmodule App.Repo.Migrations.CreateProducts do
2 use Ecto.Migration
3
4 def change do
5 create table(:products) do
6 add :title, :string
7 add :description, :string
8 add :organisation_id, references(:organisations, on_delete: :nothing), null: false
9
10 timestamps()
11 end
12
13 create index(:products, [:organisation_id])
14 end
15 end
Right now, it is failing to run because of the Line 8. The erorr that is reported is: ERROR 42P01 (undefined_table) relation "59ef85c702d24d0fac5c7e425d0d3d44.organisations" does not exist
The tenant prefix is a UUID.
So to summarise, we are wondering how to reference the public.organisations table to define the foreign key relationship in tenant.products.
Trending in Questions
Other Trending 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
- #elixirconf-us
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex










First 2 of 2 Posts!
kelvinst
Maybe using the
:prefixoption onreferencesfunction? Like this:PS.: triplex creator here, thanks for using it, hopefully you find it useful, let me know if you have any other question
johnnyicon
Thanks, @kelvinst! I actually worked it out with help from our friends on Discord. Read the documentation and smacked my head instantly. I thought I’d leave the question up on here just in case it helps someone in the future.
Re: Triplex, so far so good! We did, however, encounter a lot of deprecation warnings when running the tests on 1.11.4 OTP 23 and OTP 24 (just an FYI). All tests passed though.
(Also, now I know who to bug when I run into problems…
)