通过命令行导出 PostgreSQL 表:如何转义双引号

Exporting a PostgreSQL table via command line: how to escape double quotes

提问人:Master_T 提问时间:11/10/2023 最后编辑:CompoMaster_T 更新时间:11/10/2023 访问量:36

问:

我正在尝试使用 Windows 11 计算机上的命令行将查询结果从数据库导出到 CSV 文件。psqlPostgreSQL 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 PSQL Windows 终端

评论

1赞 Zegarek 11/10/2023
""在 Windows cmd 中应该可以正常工作。当你这样做时,你会得到什么?./psql.exe -c "select current_database(), current_user, current_setting('search_path');"
0赞 Master_T 11/10/2023
@Zegarek:感谢您的回复。你是对的,它适用于 cmd 中的 double“,问题是我正在 Windows 终端/powershell 上进行测试。知道如何在那里逃脱吗?

答:

2赞 Zegarek 11/10/2023 #1

您应该能够将内部单引号换成双美元引号 $$,这将释放字符串常量单引号 ' 用作外引号,并将双引号换成分隔标识符 ,这可以简化事情。'

在 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"

请注意,常规发生在服务器端。 提供客户端元命令 \copyCOPYpsql

./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")

评论

1赞 Master_T 11/10/2023
很棒的答案,谢谢。