提问人:Master_T 提问时间:11/10/2023 最后编辑:CompoMaster_T 更新时间:11/10/2023 访问量:36
通过命令行导出 PostgreSQL 表:如何转义双引号
Exporting a PostgreSQL table via command line: how to escape double quotes
问:
我正在尝试使用 Windows 11 计算机上的命令行将查询结果从数据库导出到 CSV 文件。psql
PostgreSQL 15
我面临的问题是,有问题的查询是这样的:
SELECT * FROM "MyTable"
但是,虽然这在通过pgAdmin运行时工作正常,但如果我运行以下命令行(为简洁起见省略了连接参数):
./psql.exe -c "COPY (SELECT * FROM MyTable) TO 'c:/out.csv'"
我收到一个错误,说:
错误:关系“mytable”不存在
第 1 行:复制(从 MyTable 中选择 *)到“c:/out.csv”
我怀疑问题可能是我没有在表名周围使用双引号“,因为如果我在没有双引号的情况下在pgAdmin中运行查询,我会得到完全相同的错误。 但是如何将双引号放在命令行中呢?在 windows cmd/powershell 命令行中,双引号是参数值分隔符,因此如果我在参数值内使用它们,它只会截断它。
我尝试使用双引号或勾号来根据我在网上找到的一些建议来转义它,但错误消息永远不会改变。我在这里做错了什么?""
`"
PS:我知道我可以在交互式shell模式下启动PSQL并从那里发出命令,但这对我来说没有好处,因为这个命令是脚本的一部分,我不希望它是交互式的,我希望它只是执行并返回到命令行。
答:
您应该能够将内部单引号换成双美元引号 $$
,这将释放字符串常量单引号 '
用作外引号,并将双引号换成分隔标识符 “
,这可以简化事情。'
在 PowerShell 中,不需要反引号来保护 因为单引号字符串是逐字的,已经阻止了它们的评估。正如下面@mklement0所指出的,在PS版本<7.3.x中,你需要的是一个反斜杠,让参数保持双引号:`
$
./psql.exe -c 'COPY \"MyTable\" TO $a$c:/out.csv$a$ CSV HEADER'
作为替代方法,您可以将文件名两边的单引号加倍:$$
./psql.exe -c 'COPY \"MyTable\" TO ''c:/out.csv'' CSV HEADER'
双双引号也应该有效,但反斜杠要求使它有点复杂:
./psql.exe -c "COPY \""MyTable\"" TO 'c:/out.csv' CSV HEADER"
请注意,常规发生在服务器端。 提供客户端元命令 \copy
:COPY
psql
./psql.exe -c "\copy \""MyTable\"" TO 'c:/out.csv' CSV HEADER"
或以pg_dump
换取,如果您可以使用或自定义转储而不是psql
.sql
.csv
./pg_dump.exe -t '\"MyTable\"' -f 'c:/MyTable_dump'
在 中,单外引号不起作用,但内侧的双引号可以正常工作:cmd
./psql.exe -c "\copy ""MyTable"" TO 'c:/out.csv' CSV HEADER"
如果要复制整个表的所有列和行,则可以直接为其名称的两个版本提供,而不是 或 。括号语法对于具有额外复杂性的查询更有用。copy
(select * from "MyTable")
(table "MyTable")
评论
""
在 Windows cmd 中应该可以正常工作。当你这样做时,你会得到什么?./psql.exe -c "select current_database(), current_user, current_setting('search_path');"