2017-01-08 2 views
2

У меня есть запрос:не может быть преобразованный к типу: naive_datetime в запросе

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:

Но когда новообращенный datatime с помощью type(^datatime, Ecto.DateTime) это работает.

Вопрос: Увидим, что это случилось, похоже, что у данных типа DateTime?

Использование нового экто 2.1.2

+0

Как вы устанавливаете значение 'datatime'? Похоже, это чарлист, а не дата? (Кроме того, вам не хватает запятой после 'datatime' в отправленном вами коде.) – Dogbert

+0

datatime - это поле« timestamp without time zone »из другой таблицы и выбрано другим запросом. 'IO.Inspect'' datatime' '# Ecto.DateTime <2016-12-04 20:11:21>' Comma - моя ошибка, исправлена. – user1156168

ответ

6

Похоже Ecto не поддерживает литье из устаревшего Ecto.DateTime к новому Elixir NaiveDateTime структуры, которые вы используете, когда вы используете :naive_datetime в Ecto 2.1+:

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 и использование нового эликсира 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] 

Если вы получаете старые из запросов структур Экто, вы, вероятно, есть старые типы, определенные для них в ваших схемах, которые вы должны изменить с field :foo, Ecto.DateTime на field :foo, NaiveDateTime (или field :foo, DateTime).

См. Также: https://github.com/elixir-ecto/ecto/blob/v2.1/CHANGELOG.md#integration-with-elixir-13-calendar-types.

+0

Спасибо за отличный ответ! Я понял, проблема, которая путала мне функцию timestamps() в схеме. Наверное, это ошибка в Ecto, добавив в e-mail «Ecto.DateTime»? – user1156168

+0

Просто 'timestamps()' в 'schema', кажется, добавляет« NaiveDateTime »для меня в Ecto 2.1.2. Вы уверены, что для вас автоматически используется 'Ecto.DateTime'? – Dogbert

+0

Спасибо, это работает. Тип 'Ecto.DateTime' находился в другом поле – user1156168

Смежные вопросы