使用\ copy时在psql中进行变量替换


8

我正在使用psql命令\ copy,我想像在编写查询脚本时一样,从外壳(用于表名)向其传递变量。我已经阅读了psql的文档

该命令的语法与SQL COPY命令的语法相似。请注意,因此,特殊的解析规则适用于\ copy命令。特别是,变量替换规则和反斜杠转义不适用。

这似乎很确定,但是我想知道是否有人知道解决方法?

Answers:


4

您可以通过将整个命令传递给psql来规避此限制:

echo "\copy tbl FROM '/path/to/myfile.pgsql'" | psql mydb

2

备注:我自己在MS Windows上偶然发现了此问题,并且已经可以使用其stdin将某些内容输入psql。我不得不合并输入。这就是真正棘手的地方。在我看来,除了Erwin的答案外,我还想分享一些有价值的信息,因此,我在此处将其发布为答案,以防其他人\copy在将数据馈入Windows平台上的stdin时也需要“使用变量” 。

如果要从stdin复制一些数据并同时使用“ variable” \copy,则括号转义可能会使情况变得棘手。下面是一个示例,说明如何完成此操作。请注意三元(转!)尖号转义括号范围列名称

@echo off
set TBL=wd
(
 echo truncate %TBL%;
 echo \copy %TBL% (depth,path,name,created,accessed,modified,size^^^) from stdin csv
 C:\msys64\usr\bin\find ^
  "e:/somepath" ^
  -type f -printf "%%d,\"%%h\",\"%%f\",\"%%t\",\"%%a\",\"%%c\",%%s\n"
) | "C:\Program Files\PostgreSQL\9.4\bin\psql.exe" -h some.server -U user dbname
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.