Elixir- 无法将 Ecto.DateTime 保存到 Postgres 数据库中,而保存 Ecto.Date 可以正常工作

Elixir- Cannot save Ecto.DateTime into Postgres database, where saving Ecto.Date works

在 Phoenix 应用程序中,我想将会话记录保存到 Postgres 数据库,expires 字段是从现在起 12 小时。我的 session 模型将 expires 字段设置为 Ecto.DateTime.

型号

schema "sessions" do
    field :key, :string
    field :expires, Ecto.DateTime
    field :user_id, :integer

    timestamps()
  end

当登录控制器中的身份验证成功时,我构造会话对象并将其发送到会话控制器中的create函数。 Timex 用于确定从现在起 12 小时后的时间。

登录控制器

{:ok, session_expiry} = Ecto.DateTime.cast(Timex.to_datetime(Timex.shift(Timex.now, hours: 12)))
# Returns {:ok, #Ecto.DateTime<2017-07-13 20:56:25.969059>}
    session_object = %{
      "key" => encrypted_auth_code,
      "expires" => session_expiry,
      "user_id" => user_id
    }
    SessionController.create(%{"data" => data = %{"type" => "session", "attributes" => session_object}})

会话控制器

def create(%{"data" => data = %{"type" => "session", "attributes" => _session_params}}) do
    changeset = Session.changeset(%Session{}, Params.to_attributes(data))
    IO.inspect _session_params
    case Repo.insert(changeset) do
      {:ok, session} ->
        IO.puts "success"
      {:error, changeset} ->
        IO.puts "failure"
    end
  end

会话控制器 case Repo.insert(changeset) do 抛出以下错误:

no function clause matching in Ecto.Adapters.Postgres.DateTime.encode_date/1

如果我将会话模型中的 expires 字段的类型更改为 Ecto.Date 数据库记录创建成功,但没有时间。

我需要更改什么才能将 Ecto.DateTime 字段保存到数据库?

如果 Ecto.Date 有效,则数据库中的字段类型可能是 date 而不是 utc_datetimetimestamp 在 PostgreSQL 中)。将其更改为 utc_datetime 应该可以修复错误。如果您使用迁移来创建 table,您可以创建一个新的来改变列的类型,如下所示:

def up do
  alter table(:sessions) do
    modify :expires, :utc_datetime
  end
end

def down do
  alter table(:sessions) do
    modify :expires, :date # old type here
  end
end