Go で SQL クエリを効果的に作成する
テキスト SQL クエリ内の文字列と値を連結するのは、Go では少し難しい場合があります。 Python とは異なり、Go の文字列フォーマット構文は異なる動作をするため、ここで発生したような一般的なエラーが発生します。
タプル構文エラー
最初のコード スニペットは Python を使用しようとしています。 -style タプル。Go ではサポートされていません。これにより、構文エラーが発生します:
query := fmt.Sprintf(`SELECT column_name FROM table_name
WHERE column1_name = %d AND column2_name = %d`,
(val1, val2))
Mismatched Types
タプル要素を文字列としてキャストしようとしても、型の不一致により失敗します:
query := fmt.Sprintf(`SELECT column_name FROM table_name
WHERE column1_name = %d AND column2_name = %d`,
val1, val2)
Avoid Operator Mismatch
パラメータを文字列としてキャストし、演算子 %s で連結すると機能しますが、お勧めしません。このアプローチでは、演算子の不一致のリスクが生じます:
query := fmt.Sprintf(`SELECT column_name FROM table_name
WHERE column1_name = %s AND column2_name = %s`,
strconv.Itoa(val1), val2)
Go ソリューション
Go で値の連結を含むテキスト SQL クエリを正しく記述するには、次のように fmt.Sprintf を使用します。
query := fmt.Sprintf(`SELECT column_name FROM table_name
WHERE column1_name = %d AND column2_name = %s`,
val1, val2)
この構文はインジェクションの脆弱性を回避し、適切な型変換を保証します。
インジェクション防止
SQL インジェクション攻撃を防ぐには、常に準備されたものを使用してください。ステートメントを使用するか、ユーザー指定の入力にエスケープ文字を提供します。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3