从命令shell处理COPY到CSV中的引号

时间:2016-07-04 21:31:01

标签: sql postgresql shell psql postgresql-copy

我正在尝试从命令shell运行此COPY查询:

COPY products_273 TO '/tmp/products_199.csv' DELIMITER ',' CSV HEADER;

我知道您可以使用psql从命令行运行查询:

psql -U username -d mydatabase -c 'SELECT * FROM mytable'

但我如何结合2?以下似乎不起作用,但我不确定如何/如果我需要逃脱。

psql -U username -d mydatabase -c 'COPY products_273 TO '/tmp/products_199.csv' DELIMITER ',' CSV HEADER;'

3 个答案:

答案 0 :(得分:2)

请勿与'混淆"",引用查询。

psql -U username -d mydatabase -c "COPY products_273 TO '/tmp/products_199.csv' DELIMITER ',' CSV HEADER;"

答案 1 :(得分:2)

最简单的解决方案是(恕我直言)使用here-documant。这也将解决(几乎)所有引用问题:

#!bin/sh
psql -U username -d mydatabase <<OMG
  COPY products_273 TO '/tmp/products_199.csv' DELIMITER ',' CSV HEADER;
OMG

答案 2 :(得分:2)

假设有一个UNIX(-oid)shell。

如果您不能使用像here document这样的@wildplasser provided我建议在 SQL命令中使用字符串文字的美元引号。用双引号替换周围的单引号将打开shell中的variable expansion,如果包含特殊字符,可能会产生副作用:$`(反引号)和{{1 }}

\

在shell中使用完整引号(单引号),字符串按原样传递,对任何字符都没有特殊含义。

如果可以排除或正确处理SQL字符串中的特殊字符,@ferhat's simple solution就可以了。

您可以使用psql -U username -d mydatabase -c 'COPY products_273 TO $$/tmp/products_199.csv$$ DELIMITER $$,$$ CSV HEADER;' 替换完全引用的字符串中的每个单引号(' - 有效地结束引用的字符串,附加文字'\''并开始一个新的完整引用。

'

相关:

将SQL命令放在单独的文件中(不包含引号)并使用psql -f

psql -U username -d mydatabase -c 'COPY products_273 TO '\''/tmp/products_199.csv'\'' DELIMITER '\'','\'' CSV HEADER;'

我假设您了解 \copy (psql元命令)和 COPY (SQL命令)之间的区别。 psql -U username -d mydatabase -f /path/to/myfile.sql 读取和写入客户端本地文件,而\copy服务器上的文件执行相同操作。如果客户端和服务器在同一安装上运行,则可以使用其中一个。但是,某些差异适用。