[Windows 10]psql 中 /copy 命令的表名中包含的美元符号转义问题

[Windows 10]Problem escaping dollar sign contained in tablename for /copy command in psql

我正在尝试设置一个 shell 脚本以将数据从 .csv 文件插入到 postgreSQL 中。作为第一个测试,我只是尝试在终端命令中执行 rto,但我 运行 遇到了问题,因为我的 table 名称中有一个“$”,我无法想出到目前为止逃避它的正确方法。

我的命令是这样的:

psql -d trm -h localhost -p 5432 -U postgres -c "\COPY ts_dev.tbl$trm_secndry_readings from 'FILEPATH' with delimiter ',' ;"

我做了几个测试,用这个命令,如果 tablename='test1' 命令有效,但是如果 tablename='prefix&test1' 那么命令失败因为终端正在尝试将“$”之后的内容解析为变量名

例如:

psql -d trm -h localhost -p 5432 -U postgres -c "\COPY schtest.prefix$name from 'FILEPATH' with delimiter ',' ;"

ERROR: relation "schtest.prefix" does not exist

我正在使用 Windows 电源shell。

您可以在 table 名称周围添加转义双引号

psql -d trm -h localhost -p 5432 -U postgres -c "\COPY 
\"ts_dev.tbl$trm_secndry_readings\" from 'FILEPATH' with delimiter ',' ;"

在 POSIX 兼容的 shell 中,例如 bash 和 PowerShell,$ 是一个 元字符 ,它在不加引号的情况下使用或在 "..." 内 - 需要 escaping 才能被解释 verbatim (以便按原样传递给命令) .

但是,转义字符在这两个 shell 中是不同的:

  • 对于 POSIX 兼容的 shell 是 \:
psql -d trm -h localhost -p 5432 -U postgres -c "\COPY ts_dev.tbl$trm_secndry_readings from 'FILEPATH' with delimiter ',' ;"
psql -d trm -h localhost -p 5432 -U postgres -c "\COPY ts_dev.tbl`$trm_secndry_readings from 'FILEPATH' with delimiter ',' ;"