The examples below use the same small sample application to demonstrate different output formats and configuration options.
| Configuration | Format | Source | Rendered |
|---|---|---|---|
| Default | DBML | Document | — |
| Default | DOT | Document | SVG |
| Default | QuickDBD | Document | — |
| Default | PlantUML | Document | SVG |
| Default | Mermaid | Document | — |
| Default | D2 | Document | SVG |
| Field comments | Mermaid | Document | — |
| No fields | DOT | Document | — |
| No fields | Mermaid | Document | — |
| No fields | D2 | Document | — |
| Contexts as clusters | DBML | Document | — |
| Contexts as clusters | DOT | Document | — |
| Contexts as clusters | PlantUML | Document | — |
| Contexts as clusters | D2 | Document | — |
Rendered demos
DOT
D2
PlantUML
Configuration files
Default
No configuration file is needed.
Field comments
# .ecto_erd.exs
alias Ecto.ERD.{Field, Node}
alias Ecto.ERD.Example.Accounts.User
[
map_node: fn
%Node{schema_module: User} = node ->
update_in(node.fields, fn fields ->
Enum.map(fields, fn
%Field{name: :email} = field -> %{field | comment: "Unique sign-in address"}
field -> field
end)
end)
node ->
node
end
]No fields
# .ecto_erd.exs
[
columns: []
]Contexts as clusters
# .ecto_erd.exs
alias Ecto.ERD.Node
[
map_node: fn
%Node{schema_module: schema_module} = node when not is_nil(schema_module) ->
case Module.split(schema_module) do
["Ecto", "ERD", "Example", context | _] -> Node.set_cluster(node, context)
_ -> node
end
node ->
node
end
]