Scala Slick: невозможно получить параметры в запросе

Я только что потратил часы на это. Я пытаюсь сделать довольно сложный запрос в PostgreSQL через Slick в Scala, но Slick НИКОГДА не учитывает ни один из моих параметров. Если я попробую что-нибудь простое:

def get(location: String) = {
  val query = sql"select * from cities_v where name = $location limit 10"
  println(query.toString)
}

Выход будет:

SQLActionBuilder(Vector(select * from cities_v where name = ? limit 10),<function2>)

Если вместо этого, я пытаюсь вставить буквальное:

def get(location: String) = {
  val query = sql"select * from cities_v where name = #$location limit 10"
  println(query.toString)
}

Выход будет:

SQLActionBuilder(Vector(select * from cities_v where name = , ville,  limit 10),<function2>

Slick ВСЕГДА будет добавлять запятые вокруг любого буквального аргумента, независимо от того, где он находится, даже если это единственный аргумент в запросе, например:

sql"#$q"

Теперь я хотел бы сделать более сложные запросы с вычислениями и вызовами функций в Postgres. Но я нигде не могу понять, что Слик не позволит мне использовать ни одну из моих переменных.

Я попытался установить все виды последствий, некоторые из которых расширяют GetResult некоторые, которые расширяются StatementParametersСлик, кажется, игнорирует их все и заменяет мои аргументы на ? или окружает их запятыми, делая все мои запросы недействительными. Я хотел бы добавить, что #$ не велик, потому что не обеспечивает санитарию. Я хотел бы придерживаться Slick, потому что он асинхронный, но я не уверен, куда идти дальше.

Это мои номера версий, согласно build.sbt:

"postgresql"         %  "postgresql"           % "9.1-901-1.jdbc4",
"com.typesafe.slick" %  "slick_2.12"           % "3.2.3",

Что я делаю неправильно?

2 ответа

Решение

Там нет ничего плохого ? появляется в тебе результат заявления. Это просто параметризованный запрос, и каждый ? представляет собой заполнитель для будущей стоимости.

Просто запустите ваши запросы к любой базе данных и проверьте результаты.

Вам нужно изменить ваш запрос следующим образом.

sql"""select * from cities_v where name = $location limit 10"""

Для получения дополнительной информации обратитесь

Другие вопросы по тегам