Postgresql

COPY 不返回計數 psql

  • February 20, 2019

我正在嘗試將 CSV 數據複製到表中。我也想列印計數。

我正在使用的命令是:

echo "begin; delete from a; \copy a from a.csv CSV HEADER; end;" | psql -hlocalhost -dpostgres -Upostgres

預期輸出:

BEGIN
DELETE 2
COPY 2
COMMIT

實際輸出:

BEGIN
DELETE 2
COMMIT

關於我在這裡缺少什麼的任何想法?

為什麼COPY 2缺少

正如文件中所說\copy

與大多數其他元命令不同,該行的整個剩餘部分始終被視為 \copy 的參數

顯然你的意圖是COPYEND命令是連續發送的,但實際上發送到伺服器並成功執行的 SQL 命令是複合語句:

COPY a FROM STDIN CSV HEADER; end;

這確實有效,但是在處理複合語句的結果時,psql 只處理最後一個,如以下所述Backslash-semicolon

psql 只列印它為每個請求收到的最後一個查詢結果

COPY 2不顯示預期的命令標記,因為它是複合語句的兩個結果中的第一個:COPYCOMMIT.

解決方法

最簡單的一種可能是使用-1or--single-transaction作為 psql 的參數,以使其將命令序列包含在事務中:

echo "delete from a; \copy a from a.csv CSV HEADER" | psql -1 [other options]

使用這種形式,行尾很清楚,因此\copy可以使用它。另外,這-1就是為之而生的原因。

如果您必須在\copy無論如何之後放置其他命令,則另一種選擇:使用heredoc 語法

$ psql [options] << ENDOFCOMMANDS
begin;
delete from a;
\copy a from a.csv CSV HEADER
-- other commands
end;
ENDOFCOMMANDS

引用自:https://dba.stackexchange.com/questions/230230