Duration Types with Postgrex
View SourceAs of Ecto 3.12.0, Ecto supports a :duration
type which maps to Elixir's Duration
struct (available as of Elixir 1.17).
One natural use case for this is when using Postgres's interval
type. Historically, Postgrex loads intervals from the database into a custom Postgrex.Interval
struct. With the introduction of Duration
, there is now the option to choose between the two. Please follow the steps below to enable mapping to Duration
.
- Define your migration
create table("movies") do
add :running_time, :interval
end
- Define your schema
defmodule Movie do
use Ecto.Schema
schema "movies" do
field :running_time, :duration
end
end
- Define your custom Postgrex type module and specify intervals should decode to
Duration
# Inside lib/my_app/postgrex_types.ex
Postgrex.Types.define(MyApp.PostgrexTypes, [], interval_decode_type: Duration)
- Make Ecto aware of the Postgrex type module in your configuration
config :my_app, MyApp.Repo, types: MyApp.PostgresTypes