我正在尝试从命令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;'
答案 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
对服务器上的文件执行相同操作。如果客户端和服务器在同一安装上运行,则可以使用其中一个。但是,某些差异适用。