elixir, ecto: невозможно передать параметр в запрос «CREATE VIEW» raw SQL - PullRequest
0 голосов
/ 15 января 2020

Мы создаем приложение elixir и используем ecto для подключения к нашей базе данных. Одной из ролей приложения является создание отчетов на основе нашего хранилища событий. Мы решили написать код для этих отчетов в формате SQL.

. Мне нужно создать временное представление с некоторыми параметрами. Рассмотрим следующий код:

Ecto.Adapters.SQL.query!(
  Repo,
  "CREATE VIEW events_view AS SELECT * FROM events WHERE type = $1",
  ["hello world"]
)

# This will fail with the following error:
# (ArgumentError) parameters must be of length 0 for query [...]

Приведенный выше код с одним параметром не работает (очевидно, на уровне ecto / postgrex). Однако удаление аргумента завершается ошибкой запроса на уровне postgres.

Ecto.Adapters.SQL.query!(
  Repo,
  "CREATE VIEW events_view AS SELECT * FROM events WHERE type = $1",
  []
)

# And this will fails because Postgres complains about a missing parameter
# (Postgrex.Error) ERROR 42P02 (undefined_parameter) there is no parameter $1

Я использовал этот способ передачи параметров для множества запросов, включая запросы SELECT и CREATE TABLE. Тем не менее, по какой-то причине CREATE VIEW, похоже, не принимает аргументов.

Есть идеи, как мне это исправить?

1 Ответ

0 голосов
/ 15 января 2020

Это ограничение PostgreSQL: параметры можно использовать только в операторах SELECT, INSERT, UPDATE и DELETE. Со всеми другими операторами вы должны создать инструкцию, включив значения в строку. Остерегайтесь SQL инъекций!

...