当前位置: 首页 > 知识库问答 >
问题:

带有SQL内插的ScalikeJDBC的未知SQL语法错误

齐铭
2023-03-14

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

当我把这个叫做:

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

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

您的SQL语法中有一个错误;检查与您的MySQL server版本对应的手册,查找使用“my_table”('key','email')值('42','user@emai'在第1行java.SQL.sqlsyntaxerroreXception:您的SQL语法中有错误;检查与您的MySQL server版本对应的手册,查找使用“my_table”('key','email')值('42','user@emai'在第1行的正确语法

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

共有1个答案

百里京
2023-03-14

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

使用MySQLinsert语句(或其他语句),表名或列值周围可能没有单引号,但允许有反勾。

您可以使用他们的sqlsyntax.createunsafety(str:string)方法,或者,如果我想像上面那样做,我可以使用sql“...”,而不是使用sql(“插入到${msg.tableName}(${msg.columns.mkstring(”,“)})的旧方法)

注意--我相信这两个都让你容易受到注射攻击。因为对我来说,这是一个本地API,无论使用它,都必须有DB的用户名和密码,所以我将使用createunsafety的方式来处理事情,并使用一些regex“cleaner”来解决一些不优雅的问题:

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()
      }
    }
  }
 类似资料:
  • 我正在运行以下SQL语法: 但不管用。我得到了这个错误: 错误1064(42000):您的SQL语法中有错误;查看与您的MySQL server版本相对应的手册,了解第1行“DISTINCT >”Number of Employees“FROM Hours”附近使用的正确语法 你能告诉我我在哪里做错了吗?对不起,我对MySQL和数据库不熟悉。

  • 请查看与您的MySQL server版本相对应的手册,以便在

  • 我是一个编程新手,有一个相当复杂的问题。我希望有人知道如何解决以下问题: 和科斯: 我只想要几个变量(这就是为什么我不能做全选)。我还认为我不应该用内部连接来编写广泛的查询,所以我没有这样做(它适用于大多数查询,除了列表变量)。 这是ContactRepository的相关部分: 如果有什么重要的东西我应该在这里补充,请告诉我。提前道谢! 编辑:应用程序运行时,只有当我尝试在运行时访问特定的数据时

  • 我试图从表中获取数据,并基于一个列添加名为'Expension'的新列,尽管在网上查看后,我的语法没有被接受。 代码: 错误:#1064-您的SQL语法有错误;请查看与您的MySQL server版本相对应的手册,了解在第2行“case WHEN product_price>10000”和“expairing”WHEN product_price<'附近使用的正确语法

  • 问题内容: 我有一个MySQL命令: 当我运行它时,我得到一个错误: 问题答案: 是不是 您应该使用SQL工具来可视化可能出现的错误,例如 MySQL Workbench 。

  • 我的SpringBoot应用程序的编译无法创建数据库。 原因:java。sql。SqlSyntaxerErrorException:您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以获取在第1行的“read bit,releaseDate date,primary key(id))engine=InnoDB”附近使用的正确语法 根据堆栈,它来自我的“释放日期”日期或我的类“书籍”中的“