Packages

Build Ecto models and tests from existing database (Postgresql)

Current section

Files

Jump to
migratrex lib models foreign_keys.ex
Raw

lib/models/foreign_keys.ex

defmodule Migratrex.ForeignKeys do
use Migratrex.Model
alias Migratrex.{TableConstraints,KeyColumnUsage,ConstraintColumnUsage}
# SELECT
# tc.constraint_name, tc.table_name, kcu.column_name,
# ccu.table_name AS foreign_table_name,
# ccu.column_name AS foreign_column_name
# FROM
# information_schema.table_constraints AS tc
# JOIN information_schema.key_column_usage AS kcu
# ON tc.constraint_name = kcu.constraint_name
# JOIN information_schema.constraint_column_usage AS ccu
# ON ccu.constraint_name = tc.constraint_name
# WHERE constraint_type = 'FOREIGN KEY' AND tc.table_name='mytable';
# SELECT t0."constraint_name", t0."table_name", k1."column_name", c2."table_name", c2."column_name"
# FROM "information_schema"."table_constraints" AS t0
# INNER JOIN "information_schema"."key_column_usage" AS k1 ON t0."constraint_name" = k1."constraint_name"
# INNER JOIN "information_schema"."constraint_column_usage" AS c2 ON c2."constraint_name" = t0."constraint_name"
# WHERE (t0."constraint_name" = 'FOREIGN KEY') AND (t0."table_name" = $1) ["accounts"] OK query=9.8ms queue=0.1ms
def foreign_keys(table_name) do
from tc in TableConstraints,
join: kcu in KeyColumnUsage, on: tc.constraint_name == kcu.constraint_name,
join: ccu in ConstraintColumnUsage, on: ccu.constraint_name == tc.constraint_name,
where: tc.constraint_type == "FOREIGN KEY",
where: tc.table_name == ^table_name,
select: %{constraint_name: tc.constraint_name,
table_name: tc.table_name,
column_name: kcu.column_name,
foreign_table_name: ccu.table_name,
foreign_column_name: ccu.column_name,
},
order_by: tc.constraint_name
end
end