首頁 >後端開發 >Golang >使用 Go 的 Query() 方法時可以使用 SET 變數執行 MySQL 查詢嗎?

使用 Go 的 Query() 方法時可以使用 SET 變數執行 MySQL 查詢嗎?

Susan Sarandon
Susan Sarandon原創
2024-10-24 02:37:02431瀏覽

Can You Execute MySQL Queries with SET Variables when Using Go's Query() Method?

Go 中使用SET 變數進行MySQL 查詢

背景:

使用者正在嘗試使用🎜>背景:

使用者正在嘗試使用Go 執行複雜的MySQL 查詢,其中涉及在執行查詢之前設定使用者變數。該查詢從控制台成功執行,但在透過 Go 執行時失敗並出現語法錯誤。使用者質疑 Go 的 Query() 方法中使用 SET 變數的可能性。

解決方案:

  1. 透過以下修改解決了使用者的問題:

      DSN 設定:
  2. 將?multiStatements=true&interpolateParams=true 新增至連接資料庫時使用的DSN。這允許在一次呼叫中執行多個語句並啟用參數插值。
    • 資料庫和表格轉換:
  3. 將資料庫和相關表轉換為utf8mb4_general_ci2排序規則。這解決了與排序規則不匹配相關的錯誤。

代碼:

<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 ?,?;
    `

    rows, err := d.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>

透過這些修改,使用者提供的程式碼應該可以運作如預期的:

透過修改DSN 配置並將資料庫和表轉換為適當的排序規則,使用者可以成功執行相關查詢,同時避免語法錯誤。

以上是使用 Go 的 Query() 方法時可以使用 SET 變數執行 MySQL 查詢嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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