PostgreSQLには、テーブルとの間で、データの効率的な一括インポートやエクスポートを可能にする機能があります。これは、通常、INSERTやSELECTを使用するよりも、はるかに速い方法で、テーブルにデータを出し入れする方法です。詳細については、COPYコマンドのためのドキュメントを参照してください。
Npgsqlは、3つのコピー操作モードをサポートしています。:binary、text、raw binary。
バイナリ・コピー
Binary COPY
このモードは、効率的なPostgreSQLバイナリ・フォーマットを使用して、データベースとの間でデータを転送します。ユーザーは、Npgsqlが、デコードとエンコードを行うAPIを使用して、行とフィールドを読み書きします。あなたが、完了したとき、あなたは、データを保存するために、Complete()を呼び出す必要があります。;それを行わないと、書き出しプログラムが破棄されたときに、COPY操作がロールバックされます。(この動作は、例外がスローされた場合に重要です)。
重要:適切な型で読み書きすることは、あなたの責任であることに注意してください!あなたが、文字列のフィールドに、int32を記述するために、COPYを使用する場合、あなたは、例外が発生したり、最悪の場合、サイレント・データが破損する可能性があります。NpgsqlDbTypeを受け入れる、Write()のオーバーロードを使うことも、強くお勧めします。あなたが、どの型を書き込みたいのか、明確に指定できるようにします。あなたは、コードを徹底的に、テストしてください。
// Import two columns to table data
// テーブル・データに、2列をインポート
using (var writer = conn.BeginBinaryImport("COPY data (field_text, field_int2) FROM STDIN (FORMAT BINARY)"))
{
writer.StartRow();
writer.Write("Hello");
writer.Write(8, NpgsqlDbType.Smallint);
writer.StartRow();
writer.Write("Goodbye");
writer.WriteNull();
writer.Complete();
}
// Export two columns to table data
// テーブル・データに2列をエクスポート
using (var reader = Conn.BeginBinaryExport("COPY data (field_text, field_int2) TO STDOUT (FORMAT BINARY)"))
{
reader.StartRow();
Console.WriteLine(reader.Read<string>());
Console.WriteLine(reader.Read<int>(NpgsqlDbType.Smallint));
reader.StartRow();
reader.Skip();
Console.WriteLine(reader.IsNull); // Null check doesn't consume the column
// nullの確認は、列を利用しません
Console.WriteLine(reader.Read<int>());
reader.StartRow(); // Last StartRow() returns -1 to indicate end of data
// 最後のStartRow()は、データの終了を示す-1を返します。
}
テキストのコピー
Text COPY
このモードは、PostgreSQLテキストやcsvフォーマットを使用して、データベースとの間でデータを転送します。適切に、テキストやCSVをフォーマットするのは、ユーザーの責任です。Npgsqlは、単純に、TextReaderやWriterを提供します。このモードは、バイナリ・コピーと比べて、あまり効率的ではありません。そして、主に、あなたが、既に、CSVや互換性を持つテキスト・フォーマットでデータを持っている、そして、性能を気にしない場合、適切です。
using (var writer = conn.BeginTextImport("COPY data (field_text, field_int4) FROM STDIN")) {
writer.Write("HELLO\t1\n");
writer.Write("GOODBYE\t2\n");
}
using (var reader = conn.BeginTextExport("COPY data (field_text, field_int4) TO STDOUT")) {
Console.WriteLine(reader.ReadLine());
Console.WriteLine(reader.ReadLine());
}
未処理のバイナリ・コピー
Raw Binary COPY
このモードでは、データ転送は、バイナリですが、Npgsqlは、エンコードやデコードを一切行いません。-データは、未処理の.NETストリームとして公開されます。このモードは、バルク・データとテーブルの復元にのみ有効です。:テーブルは、後で復元することができる、ブロブとして保存されます。あなたが、実際に、データを理解する必要がある場合、あなたは、(rawではなく)代わりに通常のバイナリモードを使うべきです。
例:
int len;
var data = new byte[10000];
// Export table1 to data array
// データ配列にtable1をエクスポート
using (var inStream = conn.BeginRawBinaryCopy("COPY table1 TO STDOUT (FORMAT BINARY)")) {
// We assume the data will fit in 10000 bytes, in real usage you would read repeatedly, writine to a file.
// 私たちは、データが、10000bytesに収まると想定しています。実際の使い方では、あなたは、繰り返し読み込み、ファイルへ書き込むでしょう。
len = inStream.Read(data, 0, data.Length);
}
// Import data array into table2
// table2に、データ配列をインポートします。
using (var outStream = conn.BeginRawBinaryCopy("COPY table2 FROM STDIN (FORMAT BINARY)")) {
outStream.Write(data, 0, len);
}
取消し
Cancel
インポート操作は、いつでも取り消すことができます。importerオブジェクトで、Cancel()メソッドを呼び出すことによって、importerが、閉じられるか、廃棄される前には、データが、データベースにコミットされません。
エクスポート操作も、また、Cancel()を呼び出すことによって、同様に取り消すことができます。
その他
Other
その他の使用例については、CopyTests.csテストフィクスチャを参照してください。