Home > C# > PostgreSQL > Npgsqlドキュメント(2014年7月25日・13改訂版)

テーブルに素早く大量のデータをコピーする

作成日 2015.03.06
最終更新日 2015.03.06

概要

PostgreSQLデータベース・サーバのための、.NET データ・プロバイダNpgsqlのドキュメント(2014年7月25日・13改訂版)の和訳です。 旧版ドキュメント(外部サイト) の和訳は存在しましたが、現行版のドキュメントのものは見つからなかったので和訳しました。 PostgreSQLとC#の両方を学ぶための資料集めの一環としての作成しています。

原文

npgsqlマニュアル(2014年7月25日・13改訂版)(外部サイト)

公式ページのドキュメントです。英語で書かれています。

テーブルに素早く大量のデータをコピーする

Fast bulk data copy into a table

バッチの挿入は、大規模なデータ量では、時間がかかります。PostgreSQLは、未加工のデータをインポートする、遙かに速いメソッドの選択肢を提供します。 その構文と入力フォーマットの選択肢は、 PostgreSQL Copyのドキュメント で、すでに説明されます。

データをクライアント側からコピーするために、あなたは、FROM STDIN選択肢を使う必要があります。

COPY IN操作に直接に供給すると、あなたは、サーバが使用する同じエンコーディングを使用して、データを提供する必要があります。

最も簡単なメソッドは、CopyIn操作コンストラクタに、読取り可能なファイルハンドルを提供することです。 開始すると、操作中のコピーは、与えられたストリームの全ての内容を読んで、それらをサーバにプッシュします。 (異なる入力フォーマットのためのCOPY文のドキュメントを参照してください!)

  1. あなたは、データベース接続文字列で、SyncNotification=trueを設定したようにします。 これは、デッドロックを防ぐために、クライアントからサーバ・ネットワーク・バッファの間で、インポート中の異常報告をキャッチためです。
  2. データベースに入力するために、データを提供するストリームにNpgsqCopyInオブジェクトを作成します。
  3. コピー操作を開始するStart()を呼び出します。操作は、すぐに完了します。
  4. Start()が、例外を投げる場合、進行中の操作を取り消すNpgsqlCopyIn.Cancel()を呼び出します。 そして、Ready For Query状態に接続をきれいにして戻してください。 そうでなければ、あなたの接続は、他の何かのために使えない、コピー・モードにとどまる可能性があります。

using System;
using System.Data;
using Npgsql;

public class CopyInExample
{

    public static void Main(String[] args)
    {

        conn = new NpgsqlConnection("Server=127.0.0.1;User id=npgsql_tests;password=npgsql_tests;SyncNotification=true;");
        conn.Open();

        NpgsqlCommand command = new NpgsqlCommand("COPY myCopyTestTable FROM STDIN", conn);
        NpgsqlCopyIn cin = new NpgsqlCopyIn( command, conn, Console.OpenStandardInput() ); // expecting input in server encoding!
        try
        {
            cin.Start();
        }
        catch(Exception e)
        {
            try
            {
                cin.Cancel("Undo copy");
            }
            catch(NpgsqlException e2)
            {
                // we should get an error in response to our cancel request:
                // 私たちは、わたしたちのキャンセル要求に応じて、エラーを取得する必要があります。:
                if( ! (""+e2).Contains("Undo copy") )
                {
                    throw new Exception("Failed to cancel copy: " + e2 + " upon failure: " + e);
                }
            }
            throw e;
        }
    }
}
			

あなたが、アプリケーションの中からデータを提供したい場合、あなたは、通常の書き込み可能なストリームを使用することができます。:

  • あなたは、データベース接続文字列で、SyncNotification=trueを設定したようにします。 これは、デッドロックを防ぐために、クライアントからサーバ・ネットワーク・バッファの間で、インポート中の異常報告をキャッチためです。
  • ストリームを指定せずに、NpgsqCopyInオブジェクトを作成します。
  • コピー操作を開始するために、Start()を呼び出します。
  • 正しいフォーマットとエンコーディングで、あなたのデータをNpgsqlCopyIn.CopyStreamに書き込みます。
  • 操作中、接続は他に何かのために使用することができません。
  • 書込みを完了するためにCopyStream.Close()やNpgsqlCopyIn.End()を呼び出します。
  • 進行中の操作を取り消し、接続を片付けて、Ready For Query状態へ戻すために、NpgsqlCopyIn.Cancel()を呼び出します。
  • 同時に、進行中の操作を取り消すために、NpgsqlCopyIn.Cancel()を呼び出します。そして、接続を片付けて、Ready For Query状態に戻してください。 そうでなければ、あなたの接続は、他の何かのために使えないコピー・モードでとどまる可能性があります。

using System;
using System.Data;
using Npgsql;

public class CopyInExample
{

    public static void Main(String[] args)
    {

        conn = new NpgsqlConnection("Server=127.0.0.1;User id=npgsql_tests;password=npgsql_tests;SyncNotification=true;");
        conn.Open();

        NpgsqlCommand command = new NpgsqlCommand("COPY myCopyTestTable FROM STDIN", conn);
        NpgsqlCopyIn cin = new NpgsqlCopyIn( command, conn );

        Stream inStream = Console.OpenStandardInput();
        Encoding inEncoding = System.Text.Encoding.ASCII;
        Encoding serverEncoding = System.Text.Encoding.BigEndianUnicode; // example assumption

        try
        {
            cin.Start();
            Stream copyInStream = cin.CopyStream;
            byte[] buf = new byte[9];
            int i;
            while( (i = inStream.Read(buf,0,buf.Length)) > 0 )
            {
                buf = System.Text.Convert( inEncoding, serverEncoding, buf, 0, i );
                copyInStream.Write( buf, 0, i );
            }
            copyInStream.Close(); // or cin.End(), if you wish
        //あなたが、望む場合、
        }
        catch(Exception e)
        {
            try
            {
                cin.Cancel("Undo copy"); // Sends CopyFail to server
        // CopyFailをサーバに送信します
            }
            catch(Exception e2)
            {
                // we should get an error in response to our cancel request:
    //私たちは、わたしたちのキャンセル要求に応じて、エラーを取得する必要があります。:
                if( ! (""+e2).Contains("Undo copy") )
                {
                    throw new Exception("Failed to cancel copy: " + e2 + " upon failure: " + e);
                }
            }
            throw e;
        }
    }
}

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

Home PC C# Illustration

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