簡體   English   中英

帶有SQL插值的ScalikeJDBC的未知SQL語法錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM