0

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

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

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

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

但是我怎样才能将两者结合起来呢?以下似乎不起作用,但我不确定如何/是否需要逃脱。

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

3 回答 3

2

不要混合'and ",引用查询与".

psql -U username -d mydatabase -c "COPY products_273 TO '/tmp/products_199.csv' DELIMITER ',' CSV HEADER;"
于 2016-07-04T21:34:38.920 回答
2

最简单的解决方案是(恕我直言)使用这里文档。这也将解决(几乎)您所有的报价问题:

#!bin/sh
psql -U username -d mydatabase <<OMG
  COPY products_273 TO '/tmp/products_199.csv' DELIMITER ',' CSV HEADER;
OMG
于 2016-07-04T22:20:08.500 回答
2

假设是 UNIX(-oid) shell。

如果您不能使用像@wildplasser 提供的此处文档,我建议在您的 SQL 命令中为字符串文字使用美元引号。用双引号替换周围的单引号会打开shell 中的变量扩展,如果包含特殊字符,这可能会产生副作用:、(反引号)和.$`\

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

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

如果可以排除或正确处理 SQL 字符串中的特殊字符,@ferhat 的简单解决方案就可以了。

或者,您可以将全引号字符串中的每个单引号 (')- 有效地结束引用的字符串,附加一个文字并开始一个新的全引号。'\'''

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 -f /path/to/myfile.sql

\copy我假设您知道(psql 元命令)和COPY(SQL 命令)之间的区别。\copy读取和写入客户端本地的文件,而COPY服务器上的文件执行相同操作。如果客户端和服务器在同一安装上运行,您可以使用其中任何一个。但是,某些差异适用。

于 2016-07-04T23:46:10.397 回答