Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- defmodule PhxAdmin do
- {:ok, _} = Application.ensure_all_started(:postgrex)
- {:ok, pid} =
- Postgrex.start_link(
- hostname: "localhost",
- username: "postgres",
- password: "postgres",
- database: "phx_admin_dev"
- )
- tables_query = """
- select table_name from information_schema.tables
- where table_schema != 'pg_catalog'
- and table_schema != 'information_schema'
- and table_name != 'schema_migrations'
- """
- %{rows: tables} =
- Postgrex.query!(
- pid,
- tables_query,
- []
- )
- relations =
- Enum.map(tables, fn [table_name] ->
- module_name = ("Elixir.Relations." <> Macro.camelize(table_name)) |> String.to_atom()
- columns_query = """
- select column_name, data_type
- from information_schema.columns
- where table_name = $1
- order by ordinal_position
- """
- %{rows: columns} = Postgrex.query!(pid, columns_query, [table_name])
- fields =
- Enum.map(columns, fn
- ["id", "bigint"] ->
- nil
- [column_name, "character varying"] ->
- {column_name, "string"}
- _ ->
- nil
- end)
- |> Enum.filter(& &1)
- module = """
- defmodule module_name do
- use Ecto.Schema
- schema table_name do
- <%= for {column_name, column_type} <- fields do %>
- field :<%= column_name %>, :<%= column_type %>
- <% end %>
- end
- end
- """
- module
- |> EEx.eval_string(fields: fields)
- |> Code.eval_string(module_name: module_name, table_name: table_name)
- module_name
- end)
- @relations relations
- def relations(), do: @relations
- end
Add Comment
Please, Sign In to add comment