#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. ах !! такая глупая ошибка. Большое вам спасибо