1

我正在尝试更新 postgresql 数据库中的表,使用 doobie 函数式 JDBC 传递动态值,同时执行低于错误的 sql 语句。任何帮助都将是可观的。

代码

工作代码

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.
4

1 回答 1

0

删除'引号 - Doobie 确保不需要它们。Doobie(以及几乎任何其他数据库库)使用参数化查询,例如:

UPDATE layout_lll
SET runtime_params = ?
WHERE run_id = ?

where?将被稍后传递的参数替换。这个:

  • 使 SQL 注入成为不可能
  • 帮助发现 SQL 语法中的错误

当您要传递参数时,这'是传递的值的一部分,而不是参数化查询的一部分。Doobie(或 JDBC 驱动程序)将为您“添加”它。您传递的变量由 Doobie 处理,它们不像普通字符串插值那样粘贴在那里

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
于 2020-08-10T08:02:00.880 回答