SQL-интерполяция с помощью ScalikeJDBC - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь воспроизвести пример SQL-интерполяции с библиотекой ScalikeJDBC ( здесь ).

val member = sql"select id, name from members where id = ${id}"
println(member.statement)

Но я получаю странный результат:

select id, name from members where id = ?

Что я пропустил?

РЕДАКТИРОВАТЬ и ОТВЕТИТЬ:

Извините, я пытался отладить, почему мой sql-запрос не работает с интерполяцией строк, поэтому я печатаю значение запроса. Я получил этот результат, но я не проверял, что все в порядке. Проблема заключалась в том, что мне пришлось использовать SQLSyntax.createUnsafely в строке, которую я хочу использовать для интерполяции.

1 Ответ

0 голосов
/ 17 мая 2018

Из вопроса не ясно, что именно вас здесь удивляет.Я полагаю, что то, что вы находите странным, это заполнитель ? в statement.Ссылочная статья показывает точно такой же запрос с заполнителем и даже явно упоминает причину этого:

Не беспокойтесь, этот код надежно защищен от атак SQL-инъекций.${id} будет заполнителем.

Если вы посмотрите на источник для SQL, который является базой для всех результатов интерполяции sql"", вытам могут отображаться два поля:

val statement: String,
private[scalikejdbc] val rawParameters: Seq[Any]

, а также есть

  final lazy val parameters: Seq[Any] = rawParameters.map {
    case ParameterBinder(v) => v
    case x => x
  }

Это сделано для того, чтобы не реализовывать сложную логику экранирования SQL в библиотеке.Вместо этого используется стандартный java.sql.PreparedStatement.Вот почему строка запроса анализируется в запросе-заполнителе и в отдельном списке параметров.

PS, если зачем нужна какая-либо форма экранирования, чтобы избежать SQL-инъекций или что плохо в SQL-инъекциях, неясно, вам, вероятно, следуетподробнее о SQL-инъекциях .

...