我有一个带有以下命令的postgres文件的SQL脚本。
COPY product_master(productId, productName) FROM 'product.txt' DELIMITERS ',' CSV;
我想处理此命令的错误(记录错误)
示例
错误:重复的密钥值违反。
COPY
命令是否返回任何值?如果没有,那么如何记录shell脚本的输出?
答案 0 :(得分:2)
您可以在数据库日志文件中记录任何和所有消息(错误,警告,...)以及大量其他信息。这是标准行为。当然,您的数据库集群必须配置为执行此操作。 Read the fine manual here
根据您的客户端,您还应该能够从数据库服务器获得错误消息作为直接答案。请注意,错误报告在与数据输出不同的流上。与shell中的stout
和stderr
一样。
从 shell ,您可能会调用psql -f
来执行脚本。看看这个演示中发生了什么:
在shell中创建一个虚拟SQL脚本:
vim test.sql
把这样的东西放进去:
CREATE temp table x (a int primary key, b int);
insert into x values (1,2),(3,4);
COPY x TO '/var/lib/postgres/dev/test.out';
COPY x FROM '/var/lib/postgres/dev/test.out';
执行它:
psql mydb -f test.sql
输出取决于各种settings like client_min_messages
:
psql:test.sql:2: NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "x_pkey" for table "x"
CREATE TABLE
INSERT 0 2
psql:test.sql:4: ERROR: duplicate key value violates unique constraint "x_pkey"
KONTEXT: COPY x, line 1: "1 2"
由于我已配置log_statement = all
(以及其他),因此我的服务器日志显示为:
2011-11-15 22:36:23 CET postgres LOG: statement: CREATE temp table x (a int primary key, b int);
2011-11-15 22:36:23 CET postgres LOG: statement: insert into x values (1,2),(3,4);
2011-11-15 22:36:23 CET postgres LOG: statement: COPY x FROM '/var/lib/postgres/dev/test.out';
2011-11-15 22:36:23 CET postgres ERROR: duplicate key value violates unique constraint "x_pkey"
2011-11-15 22:36:23 CET postgres CONTEXT: COPY x, line 1: "1 2"
2011-11-15 22:36:23 CET postgres STATEMENT: COPY x FROM '/var/lib/postgres/dev/test.out';
我不会在高效的服务器上使用log_statement = all
。这会生成巨大的日志文件。