我想编写一个脚本来使用COPY
.
psql "connection parameters" -c "COPY (SELECT * FROM tbl WHERE insertion_date > 'date') TO STDOUT WITH CSV HEADER;" | bzip2 -c > backup.csv.bz2
现在我想记录有多少行被复制到 zip 文件中?我想在复制时计算它,而不是用另一个命令。
我想编写一个脚本来使用COPY
.
psql "connection parameters" -c "COPY (SELECT * FROM tbl WHERE insertion_date > 'date') TO STDOUT WITH CSV HEADER;" | bzip2 -c > backup.csv.bz2
现在我想记录有多少行被复制到 zip 文件中?我想在复制时计算它,而不是用另一个命令。
更新:由于 Postgres 9.3 plpgsql 可以
COPY
直接访问处理的行数:我最近遇到了同样的问题。我尝试使用 plpgsql 函数,但在 Postgres 9.2 或更早版本中
ROW_COUNT
没有设置- 。COPY
您可以只运行两个查询。首先
count()
,然后COPY
。通过简单的查询,这可能是要走的路。但是对于巨大/复杂的查询,这是一种痛苦,并且可以使执行时间加倍。我想出了一个使用临时表并在执行之前计算行数的解决方案
COPY
。我为您调整了我拥有的内容,以便您可以通过
COPY TO STDOUT
管道传输到bzip2
,这在 plpgsql 函数中是不可能的:1. 创建一个函数,该函数接受一个 SQL 字符串并用它创建一个临时表:
函数执行动态 SQL,因此您可以将其用于任何查询。
这本质上是不安全的,因此请以必要的最低权限运行它,撤销公共的所有权利并
EXECUTE
专门授予受信任的用户。请按照手册中的说明进行操作!使用 创建临时表
ON COMMIT DROP
,以便在事务结束时自动删除它。GET DIAGNOSTICS
使用-获取行数ROW_COUNT
由 中的SELECT
语句设置EXECUTE
。将其写入日志 - 您的要求。无需单独的count(*)
.2. 从 shell-script 调用通过 bzip2 管道输出
将两个 SQL 命令放入您的
-c
参数或将复杂查询放入一个文件并使用该-f
参数。全部在一个事务中执行。仅返回最后一个命令的输出 - 符合我们的需要。小心语法 - 多层解释(第一个 shell,然后是 Postgres)。第一个命令是以查询字符串为参数的上述函数。第二个是
COPY TO STDOUT
。我
PostgreSQL 9.1
在 Linux 上对此进行了测试,它对我有用:文件中的数据,日志中带有行数的消息。