无法强制转换为类型:查询中的naive_datetime

时间:2017-01-08 11:34:05

标签: elixir phoenix-framework ecto

我有疑问:

 PhoenixApp.one(from r in PhoenixApp.Reply,
              where: r.inserted_at > ^datatime,
              select: count(r.id))

此查询失败,错误为:value '#Ecto.DateTime<2016-12-04 20:11:21>' in 'where' cannot be cast to type :naive_datetime in query:

但是当使用type(^datatime, Ecto.DateTime)转换数据时,它可以正常工作。

问题:发生了什么,看起来数据时间最初有DateTime类型?

使用新的Ecto 2.1.2

1 个答案:

答案 0 :(得分:8)

看起来Ecto不支持从已弃用的Ecto.DateTime投射到新的Elixir NaiveDateTime结构,当您在Ecto 2.1 +中使用:naive_datetime时,您正在使用它:

iex(1)> dt = Ecto.DateTime.utc
#Ecto.DateTime<2017-01-08 12:11:59>
iex(2)> Ecto.Type.cast :naive_datetime, dt
:error

Ecto 2.1中推荐的方法是停止使用已弃用的Ecto.DateTime结构,并在任何地方使用Elixir的新NaiveDateTime(或DateTime)。如果您仍希望在它们之间进行显式转换,则可以执行|> Ecto.DateTime.to_erl |> NaiveDateTime.from_erl!并在查询中使用该值:

iex(1)> dt = Ecto.DateTime.utc
#Ecto.DateTime<2017-01-08 12:13:50>
iex(2)> dt |> Ecto.DateTime.to_erl |> NaiveDateTime.from_erl!
~N[2017-01-08 12:13:50]

如果您从Ecto查询中获取旧结构,则可能在模式中为它们定义了旧类型,您应该从field :foo, Ecto.DateTime更改为field :foo, NaiveDateTime(或{{1} })。

另请参阅:https://github.com/elixir-ecto/ecto/blob/v2.1/CHANGELOG.md#integration-with-elixir-13-calendar-types