web-dev-qa-db-ja.com

PostgreSQLでは、COPYコマンドでデータを挿入する方法は?

PostgreSQLデータベースで1つのプロジェクトNodeJを実行すると問題が発生します。 COPYコマンドを使用してpgAdminにデータを挿入しようとするとエラーが発生します。

COPY beer (name, tags, alcohol, brewery, id, brewery_id, image) FROM stdin;

Bons Voeux  blonde  9.5 Brasserie Dupont    250 130 generic.png

Gist :のこのデータ

このエラー:

ERROR: syntax error at or near "Bons"
SQL state: 42601
Character: 1967

I was create database like this and execute file .sql:

20
user4646310
COPY tbl FROM STDIN;

pgAdminではサポートされていません。
PostgresはデータをSQLコードとして取得するため、単純な構文エラーが発生します。

Four 可能な解決策:

1.代わりに複数行のINSERTを使用します。

INSERT INTO beer(name, tags, alcohol, brewery, id, brewery_id, image)
VALUES 
  ('Bons Voeux', 'blonde', 9.5, 'Brasserie Dupont', 250, 130, 'generic.png')
, ('Boerke Blond', 'blonde', 6.8, 'Brouwerij Angerik', 233, 287 'generic.png')
;

文字列または数値リテラルとしての値の異なる(SQL)構文に注意してください。

pg_dumpを使用して--inserts でデータを生成できます。関連:

2.または、psqlを使用してコマンドラインでスクリプトを呼び出します。システムユーザーpostgresとして:

psql -f beer.sql -U my_login_role -d db_name 

データベース(-d)およびログインロール(「ユーザー」の場合は-U)は、デフォルトで問題ない場合は省略できます。構文例:

デフォルトのtext形式には、データ終了マーカー(\.)があることを確認してください。 (それがあります。) マニュアル:

データの終わりは、バックスラッシュとピリオド(\.)のみを含む1行で表すことができます。ファイルの終わりは完全に機能するため、ファイルから読み取るときにデータの終わりマーカーは必要ありません。 3.0より前のクライアントプロトコルを使用してクライアントアプリケーションとの間でデータをコピーする場合にのみ必要です。

3.またはデータをサーバー上の別のファイルに移動する/server 、たとえば「beer_data.csv」とスクリプトでCOPY .. FROM 'filename'を使用します。

COPY beer (name, tags, alcohol, brewery, id, brewery_id, image)
FROM '/path/to/beer_data.csv';

どちらの方法でも機能します。ただし、スーパーユーザー権限が必要です。 マニュアル:

[...] COPYファイルまたはコマンドの命名は、データベースのスーパーユーザー、またはデフォルトのロールpg_read_server_filespg_write_server_files、またはpg_execute_server_programのいずれかを付与されたユーザーにのみ許可されます、これは任意のファイルの読み取りまたは書き込み、またはサーバーがアクセスする特権を持っているプログラムの実行を許可するためです。

pg_read_server_filespg_write_server_files、およびpg_execute_server_programはPostgres 11で新しく追加されました。)

4.または client のローカルファイルを psqlメタコマンド\copy で読み取ります。見る:

29

最初の一歩:

pgAdminでデータベースbelgianbeersを作成します。

2番目のステップ:プロンプトを開き、次のコマンドラインを実行します。

psql -U postgres -d belgianbeers -a -f beers.sql

データベーステーブルを更新するこのコマンドライン。

-U =ユーザー名postgres

4
Claudio