psql 给出虚假错误

问题描述

当我使用 psql 使用 -f 选项或重定向输入运行脚本时,我收到虚假的错误消息。

文件是通过 pg_dump 生成的,使用“-F p”选项,它会创建一个 sql 文件

转储可以以脚本或存档文件格式输出。脚本转储是纯文本文件,其中包含将数据库重建到保存时的状态所需的 sql 命令。要从这样的脚本恢复,请将其提供给 psql。即使在其他机器和其他架构上,脚本文件也可用于重建数据库;进行一些修改,即使在其他 sql 数据库产品上也是如此。

这个sql文件片段是:

 -- Name: customer_info customer_info_pkey; Type: CONSTRAINT; Schema:
   public; Owner: javautil

   ALTER TABLE ONLY public.customer_info
       ADD CONSTRAINT customer_info_pkey PRIMARY KEY (customer_info_id);

 -- Name: customer customer_pkey; Type: CONSTRAINT; Schema: public;
   Owner: javautil

   ALTER TABLE ONLY public.customer
       ADD CONSTRAINT customer_pkey PRIMARY KEY (customer_id);

我收到以下错误

ERROR:  Syntax error at end of input
LINE 1: ALTER TABLE ONLY public.customer_info
                                         ^ 
ERROR:  Syntax error at or near "ADD"
LINE 1: ADD CONSTRAINT customer_info_pkey PRIMARY KEY (customer_info...
    ^
ERROR:  Syntax error at end of input
LINE 1: ALTER TABLE ONLY public.customer
                                    ^
ERROR:  Syntax error at or near "ADD"
LINE 1: ADD CONSTRAINT customer_pkey PRIMARY KEY (customer_id);

解决方法

听起来您正试图将 pg_dump 的输出作为标准 SQL 脚本运行。为了使用由 pg_dump 生成的文件,它们需要与 pg_restore 结合使用,其文档为 here

本质上,pg_dump 创建的文件格式是特殊的,以允许 pg_restore 选择性地恢复到数据库或输出。

,

看来这个文件的换行符以某种方式被破坏了,并且 psql 误解了行尾的位置。请注意,它首先发送一个带有 ALTER TABLE ONLY public.customer 的命令,您会收到一条命令在那里结束的抱怨(这是有道理的:该命令不完整);然后它会发送另一个命令 ADD CONSTRAINT ...,您会收到有关此问题的投诉。

我想知道您是否通过管道或类似方式过滤文件,在每行末尾放置一个 EOF。我们需要查看生成和使用备份文件的完整命令,以及有关这些命令运行环境的更多信息,才能确定。