Попробуйте обновить базу данных postgresql с помощью Doob ie, но обновления не происходит - PullRequest
1 голос
/ 04 августа 2020
• 1000

Код

Рабочий код

sql"""UPDATE layout_lll
        |SET runtime_params = 'testing string'
        |WHERE run_id = '123-ksdjf-oreiwlds-9dadssls-kolb'
        |""".stripMargin.update.quick.unsafeRunSync 

Не рабочий код

val abcRunTimeParams="testing string" 
val runID="123-ksdjf-oreiwlds-9dadssls-kolb" 

sql"""UPDATE layout_lll
    |SET runtime_params = '${abcRunTimeParams}'
    |WHERE run_id = '$runID'
    |""".stripMargin.update.quick.unsafeRunSync

Ошибка

Exception in thread "main" org.postgresql.util.PSQLException: The column index is out of range: 3, number of columns: 2.

1 Ответ

0 голосов
/ 10 августа 2020

Удалите ' кавычки - Doob ie убедитесь, что они не нужны. Doob ie (и практически любая другая библиотека БД) использует параметризованные запросы, например:

UPDATE layout_lll
SET runtime_params = ?
WHERE run_id = ?

, где ? будет заменен передачей параметров позже. Это:

  • делает SQL инъекцию невозможной
  • помогает обнаруживать ошибки в SQL синтаксисе

Когда вы хотите передать параметр, ' является частью переданного значения, а не частью параметризованного запроса. И Doob ie (или драйвер JDB C) «добавит» его за вас. Переменные, которые вы туда передаете, обрабатываются Doob ie, они не просто вставляются туда, как при обычной интерполяции строк.

TL; DR Попробуйте запустить

val abcRunTimeParams="testing string" 
val runID="123-ksdjf-oreiwlds-9dadssls-kolb" 

sql"""UPDATE layout_lll
    |SET runtime_params = ${abcRunTimeParams}
    |WHERE run_id = $runID
    |""".stripMargin.update.quick.unsafeRunSync
...