Go での SET 変数を使用した MySQL クエリ
背景:
ユーザーは次のことを試みていますGo を使用して、クエリを実行する前にユーザー変数を設定する複雑な MySQL クエリを実行します。クエリはコンソールからは正常に実行されますが、Go で実行すると構文エラーが発生して失敗します。ユーザーは、Go の Query() メソッドで SET 変数を使用できるかどうか疑問に思っています。
解決策:
ユーザーの問題は、次の変更を行うことで解決されました。
DSN 構成:
データベースとテーブルの変換:
コード:
これらの変更により、ユーザーが提供したコードは機能するはずです。期待どおり:
<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 中国語 Web サイトの他の関連記事を参照してください。