JSON → Elixir Ecto
Elixir & Phoenix Code Generation

Generador de Esquemas Ecto y Changesets de Elixir desde JSON

Guía técnica y de configuración arquitectónica para compilar cargas JSON en esquemas Elixir Ecto de producción, migraciones, changesets y typespecs de Dialyzer.

Privacidad 100% del lado del cliente
Cero transmisión al servidor
Preajustes:
Ecto Architecture & Compiler Options
Carga Útil JSON de Entrada
defmodule MyApp.Orders.Order do
  @moduledoc """
  Ecto schema for `orders`.
  Generated automatically with ToolsAA 100% Client-Side Engine.
  """
  use Ecto.Schema
  import Ecto.Changeset

  @primary_key {:id, :binary_id, autogenerate: true}
  @foreign_key_type :binary_id
  @derive {Jason.Encoder, only: [:id, :order_id, :order_number, :customer, :shipping_address, :items, :subtotal, :tax_amount, :total_amount, :currency, :is_fulfilled, :payment_status, :notes, :placed_at]}

  @type t :: %__MODULE__{}

  schema "orders" do
    field :order_id, :binary_id
    field :order_number, :string
    embeds_one :customer, MyApp.Orders.Order.Customer, on_replace: :update
    embeds_one :shipping_address, MyApp.Orders.Order.ShippingAddress, on_replace: :update
    embeds_many :items, MyApp.Orders.Order.Item, on_replace: :delete
    field :subtotal, :float
    field :tax_amount, :float
    field :total_amount, :float
    field :currency, :string
    field :is_fulfilled, :boolean
    field :payment_status, :string
    field :notes, :string
    field :placed_at, :utc_datetime

    timestamps(type: :utc_datetime)
  end

  @required_fields [:order_id, :order_number, :subtotal, :tax_amount, :total_amount, :currency, :payment_status, :placed_at]
  @optional_fields [:is_fulfilled, :notes]

  @doc false
  def changeset(model, attrs) do
    model
    |> cast(attrs, @required_fields ++ @optional_fields)
    |> validate_required(@required_fields)
    |> validate_format(:order_id, ~r/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i, message: "must be a valid UUID")
    |> validate_number(:subtotal, greater_than_or_equal_to: 0)
    |> validate_number(:tax_amount, greater_than_or_equal_to: 0)
    |> validate_number(:total_amount, greater_than_or_equal_to: 0)
    |> cast_embed(:customer, required: true)
    |> cast_embed(:shipping_address, required: true)
    |> cast_embed(:items)
  end
end

defmodule MyApp.Orders.Order.Customer do
  @moduledoc """
  Embedded schema representing `MyApp.Orders.Order.Customer`.
  """
  use Ecto.Schema
  import Ecto.Changeset

  @derive {Jason.Encoder, only: [:customer_id, :full_name, :email, :phone_number, :is_vip]}
  @primary_key false
  embedded_schema do
    field :customer_id, :string
    field :full_name, :string
    field :email, :string
    field :phone_number, :string
    field :is_vip, :boolean
  end

  @doc false
  def changeset(struct_or_changeset, attrs) do
    struct_or_changeset
    |> cast(attrs, [:customer_id, :full_name, :email, :phone_number, :is_vip])
    |> validate_required([:customer_id, :full_name, :email, :phone_number])
    |> validate_format(:email, ~r/^[^s]+@[^s]+$/, message: "must have the @ sign and no spaces")
  end
end

defmodule MyApp.Orders.Order.ShippingAddress do
  @moduledoc """
  Embedded schema representing `MyApp.Orders.Order.ShippingAddress`.
  """
  use Ecto.Schema
  import Ecto.Changeset

  @derive {Jason.Encoder, only: [:street, :city, :state, :postal_code, :country_code]}
  @primary_key false
  embedded_schema do
    field :street, :string
    field :city, :string
    field :state, :string
    field :postal_code, :string
    field :country_code, :string
  end

  @doc false
  def changeset(struct_or_changeset, attrs) do
    struct_or_changeset
    |> cast(attrs, [:street, :city, :state, :postal_code, :country_code])
    |> validate_required([:street, :city, :state, :postal_code, :country_code])
  end
end

defmodule MyApp.Orders.Order.Item do
  @moduledoc """
  Embedded schema representing `MyApp.Orders.Order.Item`.
  """
  use Ecto.Schema
  import Ecto.Changeset

  @derive {Jason.Encoder, only: [:sku, :title, :quantity, :unit_price, :discount_rate, :in_stock]}
  @primary_key false
  embedded_schema do
    field :sku, :string
    field :title, :string
    field :quantity, :integer
    field :unit_price, :float
    field :discount_rate, :float
    field :in_stock, :boolean
  end

  @doc false
  def changeset(struct_or_changeset, attrs) do
    struct_or_changeset
    |> cast(attrs, [:sku, :title, :quantity, :unit_price, :discount_rate, :in_stock])
    |> validate_required([:sku, :title, :quantity, :unit_price, :discount_rate])
    |> validate_number(:quantity, greater_than_or_equal_to: 0)
    |> validate_number(:unit_price, greater_than_or_equal_to: 0)
    |> validate_number(:discount_rate, greater_than_or_equal_to: 0)
  end
end
Tipos Ecto Detectados
13 Attributes
PK: binary_id • Timestamps: utc_datetime
Changeset Cast e Incrustaciones
3 Embedded Schemas
Strategy: embeds
Estado DDL de Base de Datos
table(:orders)
PostgreSQL & MySQL Migration Ready

Generador 100% Privado en el Cliente

Sin subidas al servidor ni telemetría. Sus cargas útiles JSON, esquemas internos y estructuras de datos se procesan estrictamente en la memoria del navegador.

Arquitectura Idiomática de Phoenix y Ecto

Genera esquemas estándar de Ecto 3.x con @derive {Jason.Encoder}, embedded_schema, changesets cast/validate, restricciones de validación y marcas de tiempo.

Generación Integral del Stack

Generación instantánea de esquemas Ecto, esquemas embebidos, migraciones de base de datos, tipos Dialyzer @type y funciones CRUD de Phoenix Context.

Referencia técnica y guía de arquitectura

Json To Elixir Ecto Referencia para Desarrolladores — Guía de referencia

Guía técnica y de configuración arquitectónica para compilar cargas JSON en esquemas Elixir Ecto de producción, migraciones, changesets y typespecs de Dialyzer.

Parámetros clave y controles

schemaMode'table' | 'embedded'

Alterna entre esquemas relacionales vinculados a tablas con Ecto.Schema y esquemas desacoplados basados en estructuras con embedded_schema.

Por defecto: 'table'
primaryKey'binary_id' | 'id' | 'none'

Configura la clave primaria de la entidad, definiendo @primary_key {:id, :binary_id, autogenerate: true} para UUIDs, enteros autoincrementales o desactivación total.

Por defecto: 'binary_id'
nestedStrategy'embeds' | 'map'

Determina si los objetos JSON anidados se descomponen en subesquemas embeds_one/embeds_many o se almacenan como tipos :map genéricos sin esquema.

Por defecto: 'embeds'
timestamps'utc_datetime' | 'naive_datetime' | 'none'

Genera macros de marcas de tiempo configuradas con precisión UTC de microsegundos, fechas ingenuas legadas o desactiva las marcas de tiempo.

Por defecto: 'utc_datetime'
smartValidationsboolean

Inspecciona los valores de muestra para inyectar validadores validate_format/3 (correos, UUIDs, URLs) y validate_number/3 en las canalizaciones de changeset.

Por defecto: true
deriveJasonboolean

Inserta @derive {Jason.Encoder, only: [...]} sobre el esquema para permitir la serialización JSON segura en vistas y controladores de Phoenix.

Por defecto: true

Consejos profesionales y mejores prácticas

Forzar precisión UTC Datetime

Utilice siempre :utc_datetime en lugar de :naive_datetime al procesar cargas útiles de APIs JSON para evitar desajustes horarios y asegurar compatibilidad total con columnas timestamptz de PostgreSQL.

Desacoplar Changesets embebidos

Al usar la estrategia de embeds, aísle las funciones de validación anidadas en módulos propios o funciones privadas pasadas a cast_embed/3 mediante :with, previniendo changesets raíz sobrecargados.

Restringir serialización Jason

Especifique siempre una lista explícita en el parámetro :only de @derive Jason.Encoder en lugar de serializar estructuras completas, protegiendo campos virtuales y datos confidenciales.

Errores comunes y solución de problemas

Error de Changeset 'is invalid' al recibir valores nulos en objetos embebidos

Ecto rechaza valores nulos en esquemas embebidos obligatorios. Defina required: false en la función cast_embed/3 o establezca una estructura predeterminada en el esquema principal para manejar nulos.

Fallo de migración en PostgreSQL por discrepancia de tipos en claves foráneas (error 42804)

Si la clave primaria se genera con binary_id, asegúrese de que las referencias foráneas en la migración especifiquen type: :binary_id (por ejemplo, references(:users, type: :binary_id)).

Preguntas frecuentes (FAQ)

¿Se transmiten los datos JSON a servidores remotos para su procesamiento?▼

No. El análisis sintáctico de JSON, la inferencia de tipos y la generación del AST de Elixir se ejecutan exclusivamente en el entorno local de JavaScript de su navegador. Sus datos confidenciales jamás salen del cliente.

¿Cómo distingue la herramienta entre tipos string, date y utc_datetime?▼

Se evalúan los valores contra expresiones regulares basadas en el estándar RFC 3339 / ISO-8601. Las marcas con huso horario se traducen a :utc_datetime, las fechas de calendario a :date y el texto general a :string.

¿Cómo se gestionan las matrices JSON con tipos de datos heterogéneos?▼

Dado que Ecto impone matrices fuertemente tipadas ({:array, :tipo}), las listas con tipos dispares se convierten automáticamente a {:array, :map} o al tipo genérico :map, garantizando estabilidad en Dialyzer.

¿Por qué se generan scripts de migración independientes junto con los esquemas?▼

Ecto separa la representación de estructuras en memoria (Ecto.Schema) de las definiciones DDL de la base de datos (Ecto.Migration). Generar ambos asegura consistencia absoluta entre la aplicación y el motor SQL.

Herramientas y utilidades relacionadas

Todas las herramientas →