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_datetime
(timestamp
在 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
在 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_datetime
(timestamp
在 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