[英]Unknown SQL syntax error for ScalikeJDBC with SQL interpolation
為了避免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? (?,?)值(?,?)
參數為:列表(My_Table,鍵,電子郵件,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中很好地執行期望的語句。 知道我的語法錯誤是什么嗎?
根據@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(",")})")
注意-我相信這兩種方法都使您容易受到注入式攻擊。 因為對我來說,這是本地API,並且無論使用它都必須具有數據庫的用戶名和密碼,所以我將使用createUnsafely
做事方式,並使用一些正則表達式“ 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()
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.