gpt4 book ai didi

mysql - 使用 SQL 插值的 ScalikeJDBC 出现未知 SQL 语法错误

转载 作者:行者123 更新时间:2023-11-29 17:49:09 29 4
gpt4 key购买 nike

为了避免 DRY,我尝试创建一个带有变量列名称和数据的 sql INSERT 语句,以通过 ScalikeJDBC 的 sql 插值填充这些列:

case class MySQLInsertMessage(tableName:String, columns:List[String], values:List[String])
def depositMessage(msg: MySQLInsertMessage): Unit = {
NamedDB('MySQLMsgDepositor) localTx { implicit session =>
val sqlStmt = sql"INSERT INTO ${msg.tableName} (${msg.columns}) VALUES (${msg.values})"
println("The sql statement is: " + sqlStmt.statement)
println("The parameters are: " + sqlStmt.parameters)
sqlStmt.update().apply()
}
}

当我用以下方式调用它时:

depositMessage(MySQLInsertMessage("My_Table", List("key", "email"), List("42", "user@email.com")))

控制台打印输出结果为:

The sql statement is: INSERT INTO ? (?, ?) VALUES (?, ?)

The parameters are: List(My_Table, key, email, 42, user@email.com)

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''My_Table' ('key', 'email') VALUES ('42', 'user@emai' at line 1 java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''My_Table' ('key', 'email') VALUES ('42', 'user@emai' at line 1

我尝试将 sql"..." 包装为这样:sql"""...""",但这似乎并不有所作为。我可以在 MySQL 工作台 GUI 中很好地执行预期的语句。知道我的语法错误是什么吗?

最佳答案

根据 @scaisEdge 的提示,ScalikeJDBC 在使用其语法时似乎总是在任何参数化值周围放置单引号。从这里来看 - https://github.com/scalikejdbc/scalikejdbc/issues/320 - 这是一个已知的问题。

使用 MySQL INSERT语句(或其他),您的表名或列值可能没有单引号,但允许使用反引号。

您可以使用他们的SQLSyntax.createUnsafely(str:String)方法,或者,如果我想像上面那样执行此操作,而不是使用 sql"..." ,我可以使用旧的方式 SQL(s"INSERT INTO ${msg.tableName} (${msg.columns.mkString(",")})")

注意 - 我相信这两者都会让您容易受到注入(inject)攻击。因为,对我来说,这是一个本地 API,无论使用它,你都必须拥有数据库的用户名和密码,所以我将使用 createUnsafely做事的方式,用一点正则表达式“清洁剂”来解决一点不优雅的想法:

def depositMessage(msg: MySQLInsertMessage): Unit = {
NamedDB('MySQLMsgDepositor) localTx { implicit session =>
val unsafeSQLRegex = "[`'\"]".r
val table = SQLSyntax.createUnsafely(s"`${unsafeSQLRegex.replaceAllIn(msg.tableName, "")}`")
val columns = SQLSyntax.createUnsafely(msg.columns.map(value => unsafeSQLRegex.replaceAllIn(value, "")).mkString("`", "`, `", "`"))
val sqlStmt = sql"INSERT INTO $table ($columns) VALUES (${msg.values})".update().apply()
}
}
}

关于mysql - 使用 SQL 插值的 ScalikeJDBC 出现未知 SQL 语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49541710/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com