SET 変数を使用した Go MySQL クエリの使用
変数を設定し、それらを複雑な変数で使用する Go MySQL クエリを作成しようとしています。 ORDER BY 句。クエリはコンソールでは正常に実行されますが、Go では構文エラーが発生します。
考えられる解決策
残念ながら、Go のデータベース/SQL パッケージは現在、MySQL ユーザーの設定をサポートしていません。定義された変数。したがって、質問で説明されているアプローチは、パッケージの現在の制限では実現できません。
代替アプローチ
動的クエリ生成:
もう 1 つの方法は、入力パラメータに基づいて ORDER BY 句を動的に生成し、変数置換の必要性を排除することです。
<code class="go">func (d *DB) SelectByUserId(uid string, srt string, pg, lim int) ([]Inventory, error) { query := ` SELECT * FROM inventory WHERE user_id = ? ORDER BY ` + generateOrderBy(srt) + ` LIMIT ?,?; ` rows, err := d.Query( query, uid, pg*lim, lim, ) // ... (rest of the code remains the same) return result, nil } func generateOrderBy(srt string) string { order := "" switch srt { case "type,asc": order = "`type` ASC" case "type,desc": order = "`type` DESC" // ... (add other cases) } return order }</code>
パラメータ展開:
または、? を手動で展開することもできます。変数の必要性を避けるために、クエリ文字列内のプレースホルダーを使用します。このアプローチには、各 ? を置き換える文字列を構築することが含まれます。対応するパラメータ値を使用します。
<code class="go">func (d *DB) SelectByUserId(uid string, srt string, pg, lim int) ([]Inventory, error) { query := fmt.Sprintf(` SELECT * FROM inventory WHERE user_id = '%s' ORDER BY CASE WHEN '%s' = 'type,asc' THEN `type` END, CASE WHEN '%s' = 'type,desc' THEN `type` END DESC, CASE WHEN '%s' = 'visible,asc' THEN visible END, CASE WHEN '%s' = 'visible,desc' THEN visible END DESC, CASE WHEN '%s' = 'create_date,asc' THEN create_date END, CASE WHEN '%s' = 'create_date,desc' THEN create_date END DESC, CASE WHEN '%s' = 'update_date,asc' THEN update_date END, CASE WHEN '%s' = 'update_date,desc' THEN update_date END DESC LIMIT %d,%d; `, uid, srt, srt, srt, srt, srt, srt, srt, srt, pg*lim, lim) rows, err := d.Query( query, ) // ... (rest of the code remains the same) return result, nil }</code>
以上がGo MySQL クエリで SET 変数を使用する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。