# `Ecto.Adapter.Schema`
[🔗](https://github.com/elixir-ecto/ecto/blob/v3.13.6/lib/ecto/adapter/schema.ex#L1)

Specifies the schema API required from adapters.

# `adapter_meta`

```elixir
@type adapter_meta() :: Ecto.Adapter.adapter_meta()
```

Proxy type to the adapter meta

# `constraints`

```elixir
@type constraints() :: Keyword.t()
```

# `fields`

```elixir
@type fields() :: Keyword.t()
```

# `filters`

```elixir
@type filters() :: Keyword.t()
```

# `on_conflict`

```elixir
@type on_conflict() ::
  {:raise, list(), []}
  | {:nothing, list(), [atom()]}
  | {[atom()], list(), [atom()]}
  | {Ecto.Query.t(), list(), [atom()]}
```

# `options`

```elixir
@type options() :: Keyword.t()
```

# `placeholders`

```elixir
@type placeholders() :: [term()]
```

# `returning`

```elixir
@type returning() :: [atom()]
```

# `schema_meta`

```elixir
@type schema_meta() :: %{
  autogenerate_id:
    {schema_field :: atom(), source_field :: atom(), Ecto.Type.t()},
  context: term(),
  prefix: binary() | nil,
  schema: atom(),
  source: binary()
}
```

Ecto.Schema metadata fields

# `autogenerate`

```elixir
@callback autogenerate(field_type :: :id | :binary_id | :embed_id) :: term() | nil
```

Called to autogenerate a value for id/embed_id/binary_id.

Returns the autogenerated value, or nil if it must be
autogenerated inside the storage or raise if not supported.

# `delete`

```elixir
@callback delete(adapter_meta(), schema_meta(), filters(), returning(), options()) ::
  {:ok, fields()} | {:invalid, constraints()} | {:error, :stale}
```

Deletes a single struct with the given filters.

While `filters` can be any record column, it is expected that
at least the primary key (or any other key that uniquely
identifies an existing record) be given as a filter. Therefore,
in case there is no record matching the given filters,
`{:error, :stale}` is returned.

# `insert`

```elixir
@callback insert(
  adapter_meta(),
  schema_meta(),
  fields(),
  on_conflict(),
  returning(),
  options()
) ::
  {:ok, fields()} | {:invalid, constraints()}
```

Inserts a single new struct in the data store.

## Autogenerate

The primary key will be automatically included in `returning` if the
field has type `:id` or `:binary_id` and no value was set by the
developer or none was autogenerated by the adapter.

# `insert_all`

```elixir
@callback insert_all(
  adapter_meta(),
  schema_meta(),
  header :: [atom()],
  [[{atom(), term() | {Ecto.Query.t(), list()}}]],
  on_conflict(),
  returning(),
  placeholders(),
  options()
) :: {non_neg_integer(), [[term()]] | nil}
```

Inserts multiple entries into the data store.

In case an `Ecto.Query` given as any of the field values by the user,
it will be sent to the adapter as a tuple with in the shape of
`{query, params}`.

# `update`

```elixir
@callback update(
  adapter_meta(),
  schema_meta(),
  fields(),
  filters(),
  returning(),
  options()
) ::
  {:ok, fields()} | {:invalid, constraints()} | {:error, :stale}
```

Updates a single struct with the given filters.

While `filters` can be any record column, it is expected that
at least the primary key (or any other key that uniquely
identifies an existing record) be given as a filter. Therefore,
in case there is no record matching the given filters,
`{:error, :stale}` is returned.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
