我有疑问:
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
答案 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。