ホームページ >バックエンド開発 >Golang >Go を使用して PostgreSQL で一括更新を効率的に実行するにはどうすればよいですか?

Go を使用して PostgreSQL で一括更新を効率的に実行するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-05 07:19:11855ブラウズ

How to Efficiently Perform Bulk Updates in PostgreSQL using Go?

Go Query Builder を使用した PostgreSQL の一括更新

PostgreSQL データベース内の複数の行を更新する必要がある場合、従来のアプローチでは、個別の UPDATE ステートメントを実行する必要があります。各行。ただし、パフォーマンス上の理由から、単一の UPDATE ステートメントを実行して複数の行を一度に更新することが望ましい場合がよくあります。

派生テーブル アプローチ

PostgreSQL での一括更新の効果的な方法の 1 つは、これを利用することです。派生テーブル。この手法では、必要な更新を含む一時テーブルを作成し、そのテーブル内のデータを使用してターゲット テーブルを更新します。

「テーブル」テーブル内の複数の行を新しいデータで更新する次のシナリオを考えてみましょう。列 "column_a" および "column_b" の値:

import (
    "database/sql"
    _"github.com/jackc/pgx/v4/stdlib" // PostgreSQL driver
)

func main() {
    db, err := sql.Open("pgx", "host=localhost port=5432 dbname=test user=postgres password=mysecretpassword")
    if err != nil {
        panic(err)
    }
    defer db.Close()

    // Prepare the derived table with updated values
    query := `UPDATE t
SET column_a = v.column_a,
    column_b = v.column_b
FROM (VALUES (1, 'FINISH', 1234),
             (2, 'UNFINISH', 3124)
     ) v(id, column_a, column_b)
WHERE v.id = t.id;`
    _, err = db.Exec(query)
    if err != nil {
        panic(err)
    }

    // Optionally, you can verify the updated rows
    rows, err := db.Query("SELECT * FROM table WHERE id IN (1, 2)")
    if err != nil {
        panic(err)
    }
    defer rows.Close()

    for rows.Next() {
        var id int
        var columnA, columnB string
        if err := rows.Scan(&id, &columnA, &columnB); err != nil {
            panic(err)
        }
        fmt.Printf("ID: %d, Column A: %s, Column B: %s\n", id, columnA, columnB)
    }
}

このアプローチにより、メインテーブルを変更せずに、派生テーブルの行と列を追加または削除する柔軟性が得られます。クエリ。また、複数の UPDATE ステートメントを明示的に指定する場合と比較して、偶発的なエラーを防ぐのにも役立ちます。

以上がGo を使用して PostgreSQL で一括更新を効率的に実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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