ホームページ >バックエンド開発 >Golang >Go のデータベース/sql パッケージを使用して SQL ステートメントを効率的にバッチ処理する方法は?

Go のデータベース/sql パッケージを使用して SQL ステートメントを効率的にバッチ処理する方法は?

DDD
DDDオリジナル
2024-12-26 13:31:10942ブラウズ

How to Batch SQL Statements Efficiently Using Go's database/sql Package?

Go データベース/sql パッケージを使用した SQL ステートメントのバッチ処理

Java では、PreparedStatement メソッドとexecuteBatch() メソッドを使用して複数の SQL ステートメントをバッチで実行できます。しかし、Go の database/sql パッケージを使用して同じことをどのように達成できるでしょうか?

database/sql パッケージには、SQL ステートメントを実行できる Exec 関数が用意されています。ただし、引数は 1 セットのみとります。複数のステートメントをバッチ処理するには、可変引数関数を使用して、実行される個々のステートメントをすべて含む単一の SQL ステートメントを構築できます。

例を次に示します。

func bulkInsert(unsavedRows []*ExampleRowStruct) error {
    var (
        valueStrings []string
        valueArgs    []interface{}
    )

    for _, post := range unsavedRows {
        valueStrings = append(valueStrings, "(?, ?, ?)")
        valueArgs = append(valueArgs, post.Column1)
        valueArgs = append(valueArgs, post.Column2)
        valueArgs = append(valueArgs, post.Column3)
    }

    stmt := fmt.Sprintf(
        "INSERT INTO my_sample_table (column1, column2, column3) VALUES %s",
        strings.Join(valueStrings, ","),
    )

    _, err := db.Exec(stmt, valueArgs...)
    return err
}

このコードは、すべての行をデータベースに挿入する単一の SQL ステートメント。個々のステートメントの引数 (値) を可変引数パラメーターとして渡すことにより、1 回のネットワーク ラウンドトリップで複数のステートメントを実行できます。テストの結果、このアプローチは SQL ステートメントのバッチ処理に Begin、Prepare、Commit メソッドを使用するよりも大幅に高速であることが示されています。

以上がGo のデータベース/sql パッケージを使用して SQL ステートメントを効率的にバッチ処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。