Postgres/PSQL - 使用批处理文件自动将查询导出到 CSV

Posted

技术标签:

【中文标题】Postgres/PSQL - 使用批处理文件自动将查询导出到 CSV【英文标题】:Postgres/PSQL - exporting automatically a query to CSV using a batchfile 【发布时间】:2022-01-23 20:54:00 【问题描述】:

当我手动执行类似魅力的命令时

psql "postgresql://server:myport/base?user=me&password=password" 

\COPY (SELECT *  FROM MyTable WHERE dt_dern_modif > '2021-12-21') TO 'C:\Users\Me\notifs_dump_cron.csv' DELIMITER ';' CSV HEADER;

我尝试创建一个批处理,以每天将 postgres 中表格的内容保存到 CSV 文件中,然后在服务器上通过 vat ftp 发送。

我使用的是 Windows 10 和 psql 11.13

我该如何做这个导出?

我暂时尝试做类似的事情,但不匹配: file.bat

    psql "postgresql://server:myport/base?user=me&password=password" -c "\COPY (SELECT *  FROM MyTable ') TO 'C:\Users\Me\notifs_dump_cron.csv' DELIMITER ';' CSV HEADER;"

当我启动它时,我会做出以下反应:

psql "postgresql://server:myport/base?user=me&password=password" -c "\COPY (SELECT * FROM bng_safcom_cen.cofi;) TO 'C:\Users\SG41RPichet\Documents\notifs_dump_cron.csv' DELIMITER ';' CSV HEADER;"
psql : attention : option supplémentaire « \COPY (SELECT * FROM bng_safcom_cen.cofi;) TO 'C:\Users\SG41RPichet\Documents\notifs_dump_cron.csv' DELIMITER ';' CSV HEADER; » ignorée
psql (11.13, serveur 10.5 (Debian 10.5-1.pgdg80+1))
Attention : l'encodage console (850) diffère de l'encodage Windows (1252).
            Les caractères 8 bits peuvent ne pas fonctionner correctement.
            Voir la section « Notes aux utilisateurs de Windows » de la page
            référence de psql pour les détails.
Connexion SSL (protocole : TLSv1.2, chiffrement : ECDHE-RSA-AES256-GCM-SHA384, bits : 256, compression : désactivé)
Saisissez « help » pour l'aide.

table=>

【问题讨论】:

在您的问题中添加完整的批处理文件脚本和运行它时收到的错误消息。 我只是不知道该怎么做。目前,我的批次是我上面的代码。但我需要在一行中完成该序列 您在哪个 shell(命令行)中运行脚本?你得到什么错误?最好的选择是命令转义问题,但没有更多信息,我无话可说。 我使用 .bat 文件。这是内容: [code] psql "postgresql://server:myport/base?user=me&password=password" -C "\COPY (SELECT * FROM MyTable WHERE dt_dern_modif > '2021-12-21') TO ' C:\Users\Me\notifs_dump_cron.csv'DELIMITER';' CSV HEADER;"[/code] 和响应:[code]psql:注意:选项 supplémentaire « \COPY (SELECT * FROM bng_safcom_cen.cofi) TO 'C:\Users\SG41RPichet\Documents\notifs_dump.csv'DELIMITER ';' CSV 标题; » ignorée psql (11.13, serverur 10.5 (Debian 10.5-1.pgdg80+1)) [/code] 我得到了提示 好的,看来用连接字符串是不可能的。您必须使用 pgpass.conf 文件 【参考方案1】:

好吧,这似乎不可能用连接字符串来做到这一点。您必须使用 pgpass.conf 文件并执行 file.bat ,例如:

psql -d base -h host -U me -w -p 5420 -c "\COPY (SELECT * FROM table WHERE dt_dern_modif > '2021-12-21') TO 'dump_cron.csv' DELIMITER ';' CSV HEADER;"

【讨论】:

其实你用的是URI的形式,不需要引用。有关更多信息,请参阅URI。遵循这种形式的东西应该可以工作:psql postgresql://postgres:postgres@localhost:5432/base -c '\COPY csv_test from csv_test.csv with csv'。其中postgres:postgres 是用户:密码。

以上是关于Postgres/PSQL - 使用批处理文件自动将查询导出到 CSV的主要内容,如果未能解决你的问题,请参考以下文章

Centos 6.6 postgresql 错误:无法执行二进制文件

PostgreSql sql shell win10 下乱码解决

Postgres:从 CLI 创建角色和密码,嵌套引号问题

命令行客户端操作pg数据库常用操作

连接PostgreSQL 显示 password authentication failed for user

修改postgresql用户password