Добавление интервала к метке времени с помощью фрагментов Ecto

#postgresql #elixir #phoenix-framework

#postgresql #эликсир #phoenix-framework

Вопрос:

Я хочу написать следующий запрос в приложении phoenix, используя фрагменты Ecto:

 select *
from (
  select id, 
  inserted_at   interval '1 day' * expiry as deadline
  from friend_referral_code
) t
where localtimestamp at time zone 'UTC' > deadline
 

Значение истечения срока действия представляет собой целое значение, представляющее количество дней. Пока у меня есть что-то вроде этого:

 query = from frc in FriendReferralCode,
  where: fragment("localtimestamp at time zone 'UTC'") > fragment("?   INTERVAL '1' * ?", frc.inserted_at, frc.expiry)

FriendReferralCode
|> Repo.all(query)
|> Enum.each(fn frc -> update_friend_referral_code_users(get_friend_referral_code_users_by(receiver_id: frc.id), %{status: false}) end)
|> IO.puts()
 

завершение

но он выдает следующую ошибку:

 ** (EXIT) an exception was raised:
        ** (FunctionClauseError) no function clause matching in Keyword.merge/2
            (elixir 1.11.2) lib/keyword.ex:764: Keyword.merge([], #Ecto.Query<from f0 in Stakester.Accounts.FriendReferralCode, where: fragment("localtimestamp at time zone 'UTC'") > fragment("?   INTERVAL '1 day' * ?", f0.inserted_at, f0.expiry)>)
 

Комментарии:

1. И вопрос в том?

2. @AdrianKlaver как записать это в elixir с использованием фрагментов

Ответ №1:

Вы ищете Ecto.Query.API.ago/2 и Ecto.Query.API.from_now/2 для интервала запроса, и Ecto.Query.subquery/2 для внутреннего select .


Кроме того, Repo.all/2 ожидает запрос в качестве первого аргумента, в то время как вы передаете FriendReferralCode в качестве первого аргумента в вызове to Repo.all/2 , где он ожидает запрос, и query в качестве второго, где он ожидает список ключевых слов с параметрами.

Сделайте просто query |> Repo.all() вместо этого.

Комментарии:

1. не могли бы вы взглянуть на мой запрос и сказать мне, где я ошибаюсь? @AlekseiMatiuskhkin

2. Как вы могли видеть из сообщения об ошибке, запрос (этот конкретный фрагмент) был построен правильно. Если вы ожидаете получить какую-либо значимую помощь, пожалуйста, поделитесь кодом, полным сообщением об ошибке и укажите на ту часть, где вы столкнулись с трудностями.

3. Я отредактировал свой вопрос и добавил код эликсира, пожалуйста, ознакомьтесь

4. ах !! такая глупая ошибка. Большое вам спасибо