web-dev-qa-db-ja.com

PostgreSQL PSQLクライアント側コマンドと改行(\ COPY)

エラーメッセージは、COPYを使用するスーパーユーザーと同じです。ファイルは、postgresサーバーと同じサーバーにあります。多くの同様の投稿を見たが、1つではない私の質問に答えます。

\copy table_name from '/path/to/csv/file.csv'
with format csv, header true ;

ERROR: syntax error at or near "format"

括弧で結ぶかどうか。 バージョン1 にあるマニュアルをよく読んでください。助けていません。私はいくつかのマイナーなポイントを欠いている必要があります、指摘してください。

4
Kemin Zhou

psql「メタコマンド」

バックスラッシュ(\)で始まるpsqlのコマンドは「 メタコマンド 」と呼ばれ、通常のセミコロンルールには従いませんが、改行で終了します。 man psql からの小さな抜粋

引数の解析は行の終わり、または引用符で囲まれていない別のバックスラッシュが見つかったときに停止します。引用符で囲まれていないバックスラッシュは、新しいメタコマンドの始まりと見なされます。特別なシーケンス\\(2つの円記号)は、引数の終わりを示し、SQLコマンドがあれば、それを解析し続けます。これにより、SQLコマンドとpsqlコマンドを1行に自由に混在させることができます。しかし、いずれにせよ、メタコマンドの引数は、行の終わりを超えて継続することはできません。

manページでこれについてもっともっと言った。はい、それは奇妙で迷惑です。これは、歴史的には、psqlコマンドが、テーブルの列を表示する\ dのように、構築中のクエリを中断せずに実行したいメタコマンドの一種だったためです。しかし、\copyのような疑似ステートメントの場合、混乱を招きます。

ここで何が起こっているのか

あなたの場合、何が起こっているのでしょうか?psqlが最初の行を実行し、次に2番目をpostgresサーバーに送信します。postgresサーバーはWITH有効なCTEステートメントトークンとして認識します 次にFORMATによって混乱します。

あなたが欲しいのは、

\copy table_name from '/path/to/csv/file.csv' with format csv, header true
5
Craig Ringer