Как использовать Ecto.Adapters.SQL.query с массивами?

Я пытаюсь использовать Ecto.Adapters.SQL.query, он отлично работает, но не для массивов. Например, это утверждение терпит неудачу:

Ecto.Adapters.SQL.query Repo, "SELECT p.* FROM posts p WHERE p.title in ($1)", 
  [["title1", "title2"]]

Ошибка:

** (ArgumentError) Postgrex expected a binary that can be encoded/cast to
type "text", got ["title1", "title2"]. Please make sure the value you are
passing matches the definition in your table or in your query or convert
the value accordingly.

ОБНОВЛЕНИЕ

Нет простого способа сделать это, но это не ограничение Ecto, это ограничение баз данных SQL/PostgreSQL, дополнительная информация и обходной путь.

Трудно поверить, что в 2016 году в базах данных SQL до сих пор отсутствует такая базовая функция...


person Alex Craft    schedule 20.03.2016    source источник


Ответы (2)


Я думаю, что ответ на этот вопрос в значительной степени совпадает с вашим предыдущим вопросом. Просто используйте синтаксис in из здесь.

Обновить

Чтобы запустить необработанный SQL-запрос для вашего примера, вы можете использовать следующее:

Ecto.Adapters.SQL.query(MyApp.Repo, "SELECT p.* FROM POSTS p WHERE p.TITLE IN ($1, $2)", ["title1", "title2"])
person NoDisplayName    schedule 20.03.2016
comment
Спасибо, да, это можно сделать с помощью Query DSL, но тем не менее возможность выполнять необработанный SQL кажется довольно фундаментальной для библиотеки SQL. Хотелось бы увидеть ответ - как это сделать. - person Alex Craft; 21.03.2016
comment
Но как отобразить результат в представлении, т.е. как использовать Ecto.Adapters.SQL.query(MyApp.Repo,..? Как передать результат в представление? Спасибо. - person W.M.; 19.07.2016

Если вы используете Postgres, вы также можете использовать ЛЮБОЙ

Ecto.Adapters.SQL.query(
  Repo,
  "SELECT p.* FROM posts p WHERE p.title = ANY($1)", 
  [["title1", "title2"]]
)

И Postgres создает такой же план запроса для In vs Any

person Arrel    schedule 24.11.2016