首頁  >  文章  >  後端開發  >  如何使用 SET 變數解決 Go for MySQL 查詢中的語法錯誤?

如何使用 SET 變數解決 Go for MySQL 查詢中的語法錯誤?

Susan Sarandon
Susan Sarandon原創
2024-10-24 04:33:30778瀏覽

How to Resolve Syntax Errors in Go for MySQL Queries Using SET Variables?

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn