Go 中使用 SET 變數進行 MySQL 查詢
在 Go 中,可以在執行 MySQL 查詢之前使用 SET 語句。但是,必須滿足某些語法要求。本文探討了嘗試執行此類查詢時遇到的問題並提供了解決方案。
原始程式碼片段涉及定義一個根據使用者 ID 和排序參數選擇記錄的函數。它在執行查詢之前使用 SET 語句為變數賦值。然而,這種方法在透過 Go 運行時會導致語法錯誤。
此錯誤可歸因於查詢的建構方式。具體來說,SET 語句需要封裝在括號中,並放置在 SELECT 語句之前。此外,MySQL DSN 應包含設定「multiStatements=true」和「interpolateParams=true」。
以下更新的程式碼片段解決了該問題:
<code class="go">func (d *DB) SelectByUserId(uid string, srt string, pg, lim int) ([]Inventory, error) { query := ` (SET @user_id := ?, @orderBy := ?;) SELECT * FROM inventory WHERE user_id = @user_id ORDER BY (CASE WHEN @orderBy = 'type,asc' THEN type END), (CASE WHEN @orderBy = 'type,desc' THEN type END) DESC, (CASE WHEN @orderBy = 'visible,asc' THEN visible END), (CASE WHEN @orderBy = 'visible,desc' THEN visible END) DESC, (CASE WHEN @orderBy = 'create_date,asc' THEN create_date END), (CASE WHEN @orderBy = 'create_date,desc' THEN create_date END) DESC, (CASE WHEN @orderBy = 'update_date,asc' THEN update_date END), (CASE WHEN @orderBy = 'update_date,desc' THEN update_date END) DESC LIMIT ?,?; ` dsn := d.dsn + "?multiStatements=true&interpolateParams=true" db, err := sql.Open("mysql", dsn) if err != nil { return nil, err } defer db.Close() rows, err := db.Query( query, uid, srt, pg*lim, lim, ) if err != nil { return nil, err } defer rows.Close() result := make([]Inventory, 0) for rows.Next() { var inv Inventory if err := rows.Scan( &inv.Id, &inv.UserId, &inv.Type, &inv.Name, &inv.Description, &inv.Visible, &inv.CreateDate, &inv.UpdateDate); err != nil { return result, err } result = append(result, inv) } if err = rows.Err(); err != nil { return result, err } return result, nil }</code>
透過包含SET 語句在括號中並在DSN 中啟用多語句和參數插值,查詢在Go 中成功執行,沒有任何語法錯誤。此外,將資料庫和資料表轉換為 utf8mb4_general_ci 排序規則可以解決與字元集相容性相關的任何潛在問題。
以上是如何使用 SET 變數解決 Go for MySQL 查詢中的語法錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!