Postgresql

使用 copy 時 psql 中的變數替換

  • January 7, 2017

我正在使用 psql 命令 \copy 並且我想從 shell 向它傳遞一個變數(用於表名),就像我在編寫查詢腳本時所做的那樣。我在 psql 的文件中讀到:

該命令的語法類似於 SQL COPY 命令的語法。請注意,正因為如此,特殊的解析規則適用於 \copy 命令。特別是,變數替換規則和反斜杠轉義不適用。

這似乎很明確,但是我想知道是否有人知道解決方法?

您可以通過將整個命令傳遞給 psql 來規避此限制:

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

*備註:*我自己在 MS Windows 上偶然發現了這個問題,我已經有一些東西可以使用它的標準輸入輸入 psql。我不得不結合輸入。這就是它變得非常棘手的地方。除了 Erwin 的答案之外,我想在我的觀點中分享一個有點有價值的例子,所以我在這裡發布它作為答案,以防其他人\copy在 Windows 平台上將數據輸入標準輸入時也需要“使用變數”。

如果您想從標準輸入複製一些數據並同時使用“變數” \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

引用自:https://dba.stackexchange.com/questions/34077