Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menyelesaikan Ralat Sintaks dalam Pergi untuk Pertanyaan MySQL Menggunakan Pembolehubah SET?
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!