如何在批处理文件中通过 URI 连接到数据库后在 psql 中使用 \copy?

How to use \copy in psql after connecting to a database via URI in a batch file?

我想制作一个 .bat 文件,它将转到一个目录,更改代码页(因为我的文件夹包含来自我母语的字符)然后在 psql 中打开数据库,然后使用 \copy 将一些表从数据库导出到我电脑上的文件夹,然后退出数据库并关闭命令。如果我手动执行它,它就像一个魅力,但 .bat 文件在进入数据库后停止。

    cd C:\Program Files\PostgreSQL.6\bin
    chcp 1250
    psql "postgres://<heres_my_URI>"
    \copy <table_name> to 'G:\<path>\name.csv' with 
 DELIMITER ',' header csv; 
    \copy <table_name> to 'G:\<path>\name.csv' with 
 DELIMITER ',' header csv;  
    \q
    exit 

我希望 .bat 文件将 csv 下载到路径并在之后自行关闭。

但是 .bat 在进入数据库之前一切正常,然后它只显示:

<mydatabase_name> =>

直到我按下 \q

\copy <table_name> to 'G:\<path>\name.csv' with 
     DELIMITER ',' header csv;

手动操作,不会发生任何事情。在我退出 DB 后,它向我显示了所有关于 \copy 无法识别的错误。我如何让它发挥作用?感谢您的帮助:)

您可以使用命令参数传递 sql: psql "postgres://" -c "copy to 'G:\name.csv' with DELIMITER ',' header csv; copy to 'G:\name.csv' with 分隔符 ',' header csv;"

你需要将所有要由psql执行的语句放在一个单独的文件中,而不是在 主 .bat 文件:

.bat 文件:

chcp 1250
psql "postgres://<heres_my_URI>" -f script.sql
exit

script.sql:

\copy <table_name> to 'G:\<path>\name.csv' with  DELIMITER ',' header csv
\copy <table_name> to 'G:\<path>\name.csv' with  DELIMITER ',' header csv  

确保每个 \copy 命令都在一行中,因为它必须如此。不过,它不必以分号结尾。