【问题标题】:Unknown SQL syntax error for ScalikeJDBC with SQL interpolation带有 SQL 插值的 ScalikeJDBC 的未知 SQL 语法错误
【发布时间】:2018-03-28 18:30:17
【问题描述】:

为了避免 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")))

生成的控制台打印输出是:

sql语句为:INSERT INTO ? (?, ?) 值 (?, ?)

参数为:List(My_Table, key, email, 42, user@email.com)

你 您的 SQL 语法有错误;检查对应的手册 您的 MySQL 服务器版本,以便在“My_Table”附近使用正确的语法 ('key', 'email') VALUES ('42', 'user@emai' 在第 1 行 java.sql.SQLSyntaxErrorException:您的 SQL 中有错误 句法;检查与您的 MySQL 服务器版本相对应的手册 在 ''My_Table' ('key', 'email') VALUES 附近使用正确的语法 ('42', 'user@emai' 在第 1 行

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

【问题讨论】:

标签: mysql scala scalikejdbc


【解决方案1】:

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

使用 MySQL INSERT 语句(或其他),您的表名或列值可能没有单引号,尽管它们可以有反引号。

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

注意 - 我相信这两种情况都会让您容易受到注入攻击。因为,对我来说,这是一个本地 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()
      }
    }
  }

【讨论】:

    猜你喜欢
    • 2018-09-20
    • 1970-01-01
    • 2018-05-27
    • 2014-08-17
    • 2019-05-06
    • 2016-03-10
    • 2017-12-22
    • 1970-01-01
    • 2020-12-27
    相关资源
    最近更新 更多