我正在尝试从bash脚本中使用DO
执行this one(psql -c
)PostgreSQL语句,在这里我想将WHERE
条件之一作为psql variable传递
类似这样的东西:
SCHEMA='foo'
! read -d '' sql_query << "EOF"
DO
$func$
BEGIN
-- RAISE NOTICE '%',
EXECUTE
(SELECT 'TRUNCATE TABLE ' || string_agg(oid::regclass::text, ', ') || ' CASCADE'
FROM pg_class
WHERE relkind = 'r' -- only tables
AND relnamespace = :'myschema'::regnamespace
);
END
$func$;
EOF
psql -h localhost -U postgres -d mydatabase -v myschema="${SCHEMA}" -c "${sql_query}"
但它失败并带有:
ERROR: syntax error at or near ":"
LINE 9: AND relnamespace = :'myschema'::regnamespace
尝试调试问题,我只写了这个简单的查询:
psql -v myschema=foo -h localhost -d mydatabase -U postgres -c "SELECT :myschema;"
ERROR: 42601: syntax error at or near ":"
LINE 1: SELECT :myschema
^
LOCATION: scanner_yyerror, scan.l:1087
或类似的变体:
psql -v myschema="'foo'" -h localhost -d mydatabase -U postgres -c "SELECT :myschema;"
psql -v myschema 'foo' -h localhost -d mydatabase -U postgres -c "SELECT :myschema;"
psql -v myschema=foo -h localhost -d mydatabase -U postgres -c "SELECT :'myschema';"
而且都不起作用。
所以问题是。可以在-c
调用中组合-v
和psql
。
注意:我知道如何解决第一个问题,避免美元报价转义,依此类推,但我对如何完成此问题(如果可以完成)的一般性问题很感兴趣。
问题是。可以在psql中组合-c和-v打电话。
否,psql不会在命令行中传递的查询中扩展变量。documentation中的以下粗体字部分暗含了它的含义:
-c命令--command = command
指定psql将执行给定的命令字符串command。可以重复此选项,并以任何顺序组合-f选项。当指定-c或-f时,psql不会读取来自标准输入的命令;相反,它在处理后终止所有-c和-f选项依次显示。
命令必须是服务器完全可解析的命令字符串(即它不包含特定于psql的功能,或者是单个反斜杠命令。