Home > C# > PostgreSQL > Npgsql > ドキュメント

コピー Npgsql

新規作成日 2019-03-05
最終更新日

COPY

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テストフィクスチャを参照してください。

このエントリーをはてなブックマークに追加

Home PC C# Illustration

Copyright (C) 2011 Horio Kazuhiko(kukekko) All Rights Reserved.
kukekko@gmail.com
ご連絡の際は、お問い合わせページのURLの明記をお願いします。
「掲載内容は私自身の見解であり、所属する組織を代表するものではありません。」