我正在开发一个项目,我必须解析一堆.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" )
)
insertion.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软件执行的。
答案 0 :(得分:1)
要检查的三件事:
列之间实际上只有一个制表符吗?空间是禁区。
是否有更多错误消息?我错过至少一个。 (见下文)
当您强制区分大小写的表和列名称时,必须执行此操作。因此,您必须写下:
copy "Sample_Table" ("Col_ID", "Col_Message") from stdin;
否则你会得到theese错误:
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时,请务必使用二进制传输。
答案 1 :(得分:1)
PgAdmin不支持以与psql相同的方式执行COPY命令(或者至少,它不是我最后一次尝试使用版本1.14时)。使用psql执行脚本,或使用INSERT语句。