# EctoDatabaseFirst
`EctoDatabaseFirst` is a database-first scaffolding library for Ecto projects.
It introspects an existing PostgreSQL schema and generates:
- Ecto schemas
- context modules
- optional snapshot migrations
- a scaffold report with architecture guidance
The focus is not just code generation. The generator also analyzes the schema and
adds practical warnings about naming, missing indexes, oversized tables, and
join-table patterns so the output is easier to maintain.
## Installation
Add the dependency to your `mix.exs`:
```elixir
def deps do
[
{:ecto_database_first, "~> 0.1.0"},
{:postgrex, "~> 0.20"}
]
end
```
## Usage
Programmatic API:
```elixir
EctoDatabaseFirst.scaffold(
otp_app: :my_app,
base_module: MyApp,
namespace: "DatabaseFirst",
repo_module: MyApp.Repo,
output_path: ".",
database: [
hostname: "localhost",
port: 5432,
username: "postgres",
password: "postgres",
database: "my_app_dev",
schema: "public"
]
)
```
Mix task:
```bash
mix ecto_database_first.scaffold \
--otp-app my_app \
--repo-module MyApp.Repo
```
Application config is also supported, which lets the consuming project keep the
scaffold setup in `config/config.exs` and only override specific values from the
CLI when needed:
```elixir
config :my_app, EctoDatabaseFirst,
base_module: MyApp,
namespace: "DatabaseFirst",
repo_module: MyApp.Repo,
output_path: ".",
report_path: "scaffold_report.md",
include_migrations?: true,
database: [
hostname: "localhost",
port: 5432,
username: "postgres",
password: "postgres",
database: "my_app_dev",
schema: "public"
]
```
With that in place, the task can run with just:
```bash
mix ecto_database_first.scaffold
```
If the app already defines an Ecto repo in `config/config.exs`, the scaffold
task can read database credentials directly from the repo configuration. This is
especially helpful for apps that already have:
```elixir
config :my_app, :ecto_repos, [MyApp.Repo]
config :my_app, MyApp.Repo,
database: "my_app_dev",
username: "postgres",
password: "postgres",
hostname: "localhost",
port: 5432
```
When multiple repos are configured, pick one explicitly with `--repo-module` or
set `repo_module:` in the `EctoDatabaseFirst` config block.
If you want the command-line options to be saved back into `config/config.exs`
for future runs, use:
```bash
mix ecto_database_first.scaffold --persist-config true
```
Generated output includes code comments and a `scaffold_report.md` file to help
developers understand the design decisions and follow-up improvements.
By default, generated code is placed under a dedicated namespace and folder such
as `MyApp.DatabaseFirst` and `lib/my_app/database_first/...` so it does not
overwrite hand-written schemas or contexts in the main application namespace.
The writer is also conservative by default and refuses to overwrite existing
files unless you pass:
```bash
mix ecto_database_first.scaffold --overwrite true
```
## Design Notes
- Schemas stay focused on fields, associations, and changesets.
- Context modules own `Repo` interaction.
- Tables are grouped into contexts conservatively to avoid fat contexts.
- Snapshot migrations are optional and primarily useful as a baseline export.
## Publishing
This project is structured as a standard Mix library and includes Hex package
metadata in `mix.exs`, so it can be published and installed like other Elixir
libraries.