Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menyelesaikan Ralat Sintaks dalam Pergi untuk Pertanyaan MySQL Menggunakan Pembolehubah SET?

Bagaimana untuk Menyelesaikan Ralat Sintaks dalam Pergi untuk Pertanyaan MySQL Menggunakan Pembolehubah SET?

Susan Sarandon
Susan Sarandonasal
2024-10-24 04:33:30852semak imbas

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

Pertanyaan MySQL dengan Pembolehubah SET dalam Go

Dalam Go, anda boleh menggunakan pernyataan SET sebelum menjalankan pertanyaan MySQL. Walau bagaimanapun, terdapat keperluan sintaks tertentu yang mesti dipenuhi. Artikel ini meneroka isu yang dihadapi semasa cuba melaksanakan pertanyaan sedemikian dan menyediakan penyelesaian.

Coretan kod asal melibatkan penentuan fungsi yang memilih rekod berdasarkan ID pengguna dan parameter pengisihan. Ia menggunakan pernyataan SET untuk memberikan nilai kepada pembolehubah sebelum melaksanakan pertanyaan. Walau bagaimanapun, pendekatan ini mengakibatkan ralat sintaks apabila dijalankan melalui Go.

Ralat boleh dikaitkan dengan cara pertanyaan dibina. Khususnya, pernyataan SET perlu dirangkumkan dalam kurungan dan diletakkan sebelum pernyataan SELECT. Selain itu, MySQL DSN harus menyertakan tetapan "multiStatements=true" dan "interpolateParams=true."

Coretan kod dikemas kini berikut menyelesaikan isu:

<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>

Dengan melampirkan pernyataan SET dalam kurungan dan mendayakan berbilang pernyataan dan interpolasi parameter dalam DSN, pertanyaan berjaya dilaksanakan dalam Go tanpa sebarang ralat sintaks. Selain itu, menukar pangkalan data dan jadual kepada pengumpulan utf8mb4_general_ci menyelesaikan sebarang isu yang berpotensi berkaitan dengan keserasian set aksara.

Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Ralat Sintaks dalam Pergi untuk Pertanyaan MySQL Menggunakan Pembolehubah SET?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn