Как запросить пустой массив в jsonb PostgreSQL с помощью Elixir / Ecto - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть схема Ecto с embeds_many, определенным так:

  schema "rounds" do
    embeds_many :growth_cycles, SomeModule.GrowthCycle, on_replace: :delete
  end

Это переводит в поле jsonb в PostgreSQL. Значением по умолчанию является пустой массив - []. Я хотел бы написать Ecto-запрос, который возвращает только раунды, которые имеют growth_cycles = [] (рост_циклов не задан / пуст).

Самое простое, что я попробовал, было:

    from(r in Round, where: r.growth_cycles == [])

Но это дает следующую ошибку:

** (Postgrex.Error) ERROR 42P18 (indeterminate_datatype) cannot determine type of empty array
...
hint: Explicitly cast to the desired type, for example ARRAY[]::integer[].

Я также пробовал:

    from(r in Round, where: length(r.growth_cycles) == 0)

Но это выдает ошибку, говорящую, что длина не является допустимым выражением запроса.

Я вижу ссылки на использование фрагментов для перехода к необработанному PostgreSQL, но я не уверен, как это сделать.

1 Ответ

1 голос
/ 16 апреля 2019

Вы можете попробовать использовать фрагмент / 1 для вставки необработанного SQL в ваши запросы.

В этом случае что-то вроде

(from r in Round, where: fragment("? = '{}'", r.growth_cycles)) |> Repo.all

должно работать

Из документации:

Невозможно представить все возможные запросы к базе данных, используя синтаксис запросов Ecto.Когда это требуется, можно использовать фрагменты для отправки любого выражения в базу данных:

...