pgx を使用した Go の Postgres での一括 INSERT: 解決済み
指定された Go コードで、INSERT ステートメントを手動で作成して実行していますpgx.Execを使用します。ただし、このアプローチは、特に一括挿入の場合、非効率的でエラーが発生しやすい可能性があります。
問題の識別
エラー メッセージ「expected 10 argument, got 1」は、提供された引数の数とデータベースが予期する引数の数が一致していません。このエラーは、INSERT ステートメントを手動で作成しており、引数の数または順序を間違えた可能性があるために発生します。
正しいアプローチ
一括挿入を実行するにはこのような操作用に設計された PostgreSQL コピー プロトコルを利用する pgx の CopyFrom 機能を効率的に活用します。 CopyFrom を使用すると、ソースからテーブルに行を一括挿入できます。
CopyFrom を使用したコード例
package main import ( "context" "fmt" "log" "github.com/jackc/pgx/v4" ) const ( dbUrl = "db url..." ) type tempKey struct { keyVal string lastKey int } func main() { conn, err := pgx.Connect(context.Background(), dbUrl) if err != nil { log.Fatalf("Error connecting to the database: %v", err) } defer conn.Close(context.Background()) data := []tempKey{ {keyVal: "abc", lastKey: 10}, {keyVal: "dns", lastKey: 11}, {keyVal: "qwe", lastKey: 12}, {keyVal: "dss", lastKey: 13}, {keyVal: "xcmk", lastKey: 14}, } copyCount, err := conn.CopyFrom( context.Background(), pgx.Identifier{"keys"}, // Table name []string{"keyval", "lastval"}, // Column names pgx.CopyFromRows(data), // Copy from a slice of structs ) if err != nil { log.Fatalf("Error copying data to the database: %v", err) } fmt.Printf("%d rows copied successfully.\n", copyCount) }
以上がpgx を使用して Go で Postgres に一括挿入を効率的に実行する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。