Postgresql
COPY 不返回計數 psql
我正在嘗試將 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 的參數
顯然你的意圖是
COPY
和END
命令是連續發送的,但實際上發送到伺服器並成功執行的 SQL 命令是複合語句:COPY a FROM STDIN CSV HEADER; end;
這確實有效,但是在處理複合語句的結果時,psql 只處理最後一個,如以下所述
Backslash-semicolon
:psql 只列印它為每個請求收到的最後一個查詢結果
COPY 2
不顯示預期的命令標記,因為它是複合語句的兩個結果中的第一個:COPY
和COMMIT
.解決方法
最簡單的一種可能是使用
-1
or--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