Go での効率的な複数データ挿入
1 回の操作でデータベースに複数のデータ行を挿入すると、効率が大幅に向上します。 Go では、これを実現する一般的な方法の 1 つは、準備されたステートメントを使用することです。質問で示されているように文字列連結を使用すると便利に見えるかもしれませんが、安全性が低く、SQL インジェクションの脆弱性を引き起こす可能性があります。
準備されたステートメントの使用
複数の行を挿入するには準備されたステートメントを使用するには、次の手順に従います。
INSERT INTO test(n1, n2, n3) VALUES (?, ?, ?)
stmt, err := db.Prepare(sqlStr) if err != nil { // Handle error }
vals := []interface{}{} for _, dataRow := range data { vals = append(vals, dataRow["v1"], dataRow["v2"], dataRow["v3"]) }
res, err := stmt.Exec(vals...) if err != nil { // Handle error }
このアプローチでは、SQL ステートメントが 1 回だけ解析され、その値が保証されます。のようにしっかりと挿入されていますパラメータ。
例:
プリペアド ステートメントを使用して「テスト」テーブルに複数の行を挿入する例を次に示します:
import ( "database/sql" "fmt" ) type DataRow struct { v1 string v2 string v3 string } func main() { data := []DataRow{ {v1: "1", v2: "1", v3: "1"}, {v1: "2", v2: "2", v3: "2"}, {v1: "3", v2: "3", v3: "3"}, } db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/database") if err != nil { // Handle error } sqlStr := "INSERT INTO test(n1, n2, n3) VALUES (?, ?, ?)" stmt, err := db.Prepare(sqlStr) if err != nil { // Handle error } vals := []interface{}{} for _, dataRow := range data { vals = append(vals, dataRow.v1, dataRow.v2, dataRow.v3) } res, err := stmt.Exec(vals...) if err != nil { // Handle error } affectedRows, err := res.RowsAffected() if err != nil { // Handle error } fmt.Printf("Inserted %d rows", affectedRows) }
以上が準備されたステートメントを使用して Go データベースに複数行のデータを効率的に挿入するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。