0

私は、いくつかのC ++関数を介して、さまざまな形式のさまざまな種類のデータを含む多数の.csvファイルを解析する必要があるプロジェクトに取り組んでいます。その後、ファイルからデータを抽出し、psqlにインポートできる.sqlファイルを作成して、後の段階でデータをPostgreSQLデータベースに挿入します。

しかし、.sqlファイルの正しい構文を理解することはできません。これが私が得ているのと同じエラーを再現するサンプルテーブルとサンプル.sqlファイルです:

テーブル作成コード:

CREATE TABLE "Sample_Table"
(
  "Col_ID" integer NOT NULL,
  "Col_Message" character varying(50),
  CONSTRAINT "Sample_Table_pkey" PRIMARY KEY ("Col_ID" )
)

insert.sql(コピー行の後、単一のタブ文字で区切られたフィールド)

copy Sample_Table (Col_ID, Col_Message) from stdin;
1   This is Spaaarta
2   Why So Serious
3   Baazinga
\.

上記のSQLファイルを実行すると、次のエラーが発生します。

ERROR:  syntax error at or near "1"
LINE 2: 1 This is Spaaarta
        ^


********** Error **********

それが役立つ場合は、PostgreSQL 9.1リリースを実行しており、上記のクエリはすべてPGAdminIIIソフトウェアを介して実行されました。

4

2 に答える 2

1

3 つの確認事項:

  • 列の間に実際に 1 つのタブ文字がありますか? スペースは厳禁です。

  • 他にエラー メッセージはありますか? 少なくとも1 つ欠けています。(下記参照)

  • 大文字と小文字を区別するテーブル名と列名を強制すると、結果としてこれを行う必要があります。したがって、次のように記述する必要があります。

copy "Sample_Table" ("Col_ID", "Col_Message") from stdin;

そうしないと、次のエラーが発生します。

psql:x.sql:1: ERROR:  relation "sample_table" does not exist
psql:x.sql:5: invalid command \.
psql:x.sql:5: ERROR:  syntax error at or near "1"
LINE 1: 1 This is Spaaarta
        ^

これらが整っていれば、サンプルデータをうまく使用できます。

編集バグの変更: 質問者は今持っています

ERROR: invalid input syntax for integer: "1 'This is Spaaarta'"

だから何かが1OKではありません。

私の推測では、これはエンコーディングの問題です。ここでは、UTF-16 を使用する Windows が原因である可能性があります。

Web 以外でこの種の問題をデバッグするのは簡単ではありません。なぜなら、多くのセミインテリジェントなプログラムが並んでいるからです。それらのほとんどは、「いくつかの」ことを調整するのが好きです。

ただし、最初に psql でいくつかのことを確認してください。

\encoding
show client_encoding;
show server_encoding;

ペーストビン データによると、これらは同じで、"SQL_ASCII"、"LATIN1"、または "UTF-8" のいずれかである必要があります。

それらが既にある場合、またはそれらを調整しても解決しない場合: Unix/Linux/cygwin にhexdump -C x.sqlプログラムがある場合は、その出力を pastebin に投稿します。ultraedit などの Windows エディタの hexdump は使用しないでください。何度かだまされました。ファイルを Linux に転送する場合は、必ずバイナリ転送を使用してください。

于 2012-02-10T15:08:39.820 に答える
1

PgAdmin は、psql と同じ方法での COPY コマンドの実行をサポートしていません (少なくとも、バージョン 1.14 で最後に試したときはそうではありませんでした)。psql を使用してスクリプトを実行するか、INSERT ステートメントを使用します。

于 2012-02-10T15:55:43.607 に答える