0

我正在做一个项目,我必须解析一堆 .csv 文件,所有不同的格式并通过一些 C++ 函数包含不同类型的数据。之后,我从文件中提取数据并创建一个 .sql 文件,该文件可以在 psql 中导入,以便稍后将数据插入 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 版本,并且所有上述查询都是通过 PGAdmin III 软件执行的。

4

2 回答 2

1

PgAdmin 不支持以与 psql 相同的方式执行 COPY 命令(或者至少,我上次尝试使用 1.14 版本时不支持)。使用 psql 执行脚本,或使用 INSERT 语句。

于 2012-02-10T15:55:43.607 回答
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'"

所以有些东西1是不行的。

我的猜测是,这是一个编码问题。带有 UTF-16 的 Windows 可能是这里的罪魁祸首。

调试网络以外的这类问题并不容易,因为很多半智能程序都在行,他们中的大多数都喜欢调整“一些”的东西。

但首先检查 psql 中的一些内容:

\encoding
show client_encoding;
show server_encoding;

根据 pastebin 数据,这些应该是相同的,并且是“SQL_ASCII”、“LATIN1”或“UTF-8”之一。

如果它们已经存在或者调整它们没有帮助:Unix/Linux/cygwin 有一个hexdump -C x.sql程序,将其输出发布到 pastebin。不要使用任何 Windows 编辑器(如 ultraedit)中的 hexdump - 他们已经欺骗了我好几次。将文件传输到 Linux 时,请务必使用二进制传输。

于 2012-02-10T15:08:39.820 回答