245

次の名前のデータベース スキーマnyummyと、次の名前のテーブルがありますcimory

create table nyummy.cimory (
  id numeric(10,0) not null,
  name character varying(60) not null,
  city character varying(50) not null,
  CONSTRAINT cimory_pkey PRIMARY KEY (id)
);

cimoryテーブルのデータを挿入 SQL スクリプト ファイルとしてエクスポートしたいと考えています。ただし、都市が「tokyo」と等しいレコード/データのみをエクスポートしたいと考えています (都市データはすべて小文字であると仮定します)。

どうやってするの?

ソリューションがフリーウェアの GUI ツールであるか、コマンド ラインであるかは問題ではありません (ただし、GUI ツール ソリューションの方が優れています)。pgAdmin III を試してみましたが、これを行うオプションが見つかりません。

4

11 に答える 11

359

エクスポートするセットを含むテーブルを作成し、コマンド ライン ユーティリティ pg_dump を使用してファイルにエクスポートします。

create table export_table as 
select id, name, city
from nyummy.cimory
where city = 'tokyo'
$ pg_dump --table=export_table --data-only --column-inserts my_database > data.sql

--column-inserts列名を持つ挿入コマンドとしてダンプします。

--data-onlyスキーマをダンプしません。

以下にコメントされているように、テーブルの代わりにビューを作成すると、新しいエクスポートが必要になるたびにテーブルの作成が不要になります。

于 2012-10-10T09:31:59.707 に答える
205

データのみをエクスポートCOPYするには、次を使用します。

COPY (SELECT * FROM nyummy.cimory WHERE city = 'tokio') TO '/path/to/file.csv';

テーブル全体、選択した列のみ、または示されているようにクエリの結果をエクスポートできます。テーブルを明示的に作成する必要はありません。

INSERTプレーン テキスト (コマンドではありません) として、1 行に 1 つのテーブル行を含むファイルを取得します。INSERTコマンドよりも小さく、高速です。

どこでも同じ構造の別の Postgres テーブルに同じものをインポートするには (列は同じ順序で、データ型は互換性があります!):

COPY other_tbl FROM '/path/to/file.csv';

COPYクライアントに対してローカルなファイルを読み書きする やpg_dumpのようなクライアント プログラムとは異なり、サーバーに対してローカルなファイルを読み書きします。psql両方が同じマシンで実行されている場合は、あまり問題になりませんが、リモート接続の場合は問題になります。

psql\copyのコマンドもあります:

フロントエンド (クライアント) コピーを実行します。これは SQL コマンドを実行する操作ですがCOPY、サーバーが指定されたファイルを読み書きする代わりに、psql がファイルを読み書きし、サーバーとローカル ファイル システムの間でデータをルーティングします。これは、 ファイルのアクセシビリティと権限は、サーバーではなくローカル ユーザーのものであり、SQL スーパーユーザー権限は必要ないことを意味します。

上記と同じ構文。COPYに置き換えるだけ\copyです。

于 2012-10-10T17:16:45.403 に答える
46

これは、追加のインストールなしで手動で pgAdmin を使用してテーブルをスクリプトにエクスポートする簡単かつ迅速な方法です。

  1. 対象のテーブルを右クリックし、[バックアップ] を選択します。
  2. バックアップを保存するファイル パスを選択します。フォーマットとして「プレーン」を選択します。
  3. 下部にある「Dump Options #2」タブを開き、「Use Column Inserts」にチェックを入れます。
  4. バックアップボタンをクリックします。
  5. 結果のファイルをテキスト リーダー (notepad++ など) で開くと、テーブル全体を作成するスクリプトが取得されます。そこから、生成された INSERT ステートメントをコピーするだけです。

このメソッドは、@Clodoaldo Neto の回答で示されているように、export_table を作成する手法でも機能します。

ターゲットテーブルを右クリックして選択します

宛先パスを選択し、形式を次のように変更します

タブを開く

そこから INSERT ステートメントをコピーできます。

于 2016-08-15T20:13:04.833 に答える
3

特定のレコードを含むテーブルのビューを作成し、SQL ファイルをダンプできます

CREATE VIEW foo AS
SELECT id,name,city FROM nyummy.cimory WHERE city = 'tokyo'
于 2012-10-10T08:54:59.293 に答える
1

これを行うための簡単な手順を作成しました。単一の行に対してのみ機能するため、必要な行を選択するだけの一時ビューを作成し、pg_temp.temp_view を挿入する実際のテーブルに置き換えます。

CREATE OR REPLACE FUNCTION dv_util.gen_insert_statement(IN p_schema text, IN p_table text)
  RETURNS text AS
$BODY$
DECLARE
    selquery text; 
    valquery text; 
    selvalue text; 
    colvalue text; 
    colrec record;
BEGIN

    selquery := 'INSERT INTO ' ||  quote_ident(p_schema) || '.' || quote_ident(p_table);

    selquery := selquery || '(';

    valquery := ' VALUES (';
    FOR colrec IN SELECT table_schema, table_name, column_name, data_type
                  FROM information_schema.columns 
                  WHERE table_name = p_table and table_schema = p_schema 
                  ORDER BY ordinal_position 
    LOOP
      selquery := selquery || quote_ident(colrec.column_name) || ',';

      selvalue := 
        'SELECT CASE WHEN ' || quote_ident(colrec.column_name) || ' IS NULL' || 
                   ' THEN ''NULL''' || 
                   ' ELSE '''' || quote_literal('|| quote_ident(colrec.column_name) || ')::text || ''''' || 
                   ' END' || 
        ' FROM '||quote_ident(p_schema)||'.'||quote_ident(p_table);
      EXECUTE selvalue INTO colvalue;
      valquery := valquery || colvalue || ',';
    END LOOP;
    -- Replace the last , with a )
    selquery := substring(selquery,1,length(selquery)-1) || ')';
    valquery := substring(valquery,1,length(valquery)-1) || ')';

    selquery := selquery || valquery;

RETURN selquery;
END
$BODY$
  LANGUAGE plpgsql VOLATILE;

次のように呼び出されます。

SELECT distinct dv_util.gen_insert_statement('pg_temp_' || sess_id::text,'my_data') 
from pg_stat_activity 
where procpid = pg_backend_pid()

インジェクション攻撃に対してこれをテストしていません。quote_literal 呼び出しが十分でない場合はお知らせください。

また、単純に ::text にキャストして元に戻すことができる列に対してのみ機能します。

これも Greenplum 用ですが、Postgres、CMIIW で動作しない理由が思いつきません。

于 2017-02-17T10:23:29.557 に答える
-3

" EXECUTE QUERY WRITE RESULT TO FILE " オプション を指定してクエリを実行するpgadminで試しましたか

その唯一のデータをエクスポートし、そうでなければ次のように試してください

pg_dump -t view_name DB_name > db.sql

-t オプションの使用 ==> テーブル (またはビューまたはシーケンス) に一致するテーブルのみをダンプ、参照

于 2012-10-10T09:22:06.180 に答える