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 中国語 Web サイトの他の関連記事を参照してください。