Packages
Create Migrations and Scaffolding from a Pre-Existing Database.
Current section
Files
Jump to
Current section
Files
lib/module.ex
defmodule ExDbmigrate.Module do
@moduledoc """
Generates Elixir modules from database tables using Ecto.
## Usage
ExDbmigrate.Module.generate_modules(ExDbmigrate.Repo)
"""
@doc """
Generates Elixir modules for all tables in the database.
"""
def generate_modules(repo, opts \\ []) do
tables = Repo.list_tables(repo)
Enum.each(tables, fn table ->
columns = Repo.get_columns(repo, table)
module_code = build_module(table, columns)
save_module(table, module_code, opts)
end)
end
defp build_module(table, columns) do
struct_fields =
columns
|> Enum.map(fn col ->
name = Map.get(col, "column_name") || Map.get(col, "Field")
":#{name}"
end)
|> Enum.join(", ")
"""
defmodule #{Macro.camelize(table)} do
use Ecto.Schema
schema "#{table}" do
# Fields:
#{Enum.map(columns, fn col ->
name = Map.get(col, "column_name") || Map.get(col, "Field")
type = Map.get(col, "data_type") || Map.get(col, "Type")
" field :#{name}, :string # type: #{type}"
end) |> Enum.join("\n")}
end
end
"""
end
defp save_module(table, code, opts) do
path = Keyword.get(opts, :out_dir, "generated")
File.mkdir_p!(path)
file_path = Path.join(path, "#{table}.ex")
File.write!(file_path, code)
end
end