是否可以在psql中组合`-c`和`-v`?

问题描述 投票:3回答:1

我正在尝试从bash脚本中使用DO执行this onepsql -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调用中组合-vpsql

注意:我知道如何解决第一个问题,避免美元报价转义,依此类推,但我对如何完成此问题(如果可以完成)的一般性问题很感兴趣。

bash postgresql psql
1个回答
0
投票

问题是。可以在psql中组合-c和-v打电话。

否,psql不会在命令行中传递的查询中扩展变量。documentation中的以下粗体字部分暗含了它的含义:

-c命令--command = command

指定psql将执行给定的命令字符串command。可以重复此选项,并以任何顺序组合-f选项。当指定-c或-f时,psql不会读取来自标准输入的命令;相反,它在处理后终止所有-c和-f选项依次显示。

命令必须是服务器完全可解析的命令字符串(即它不包含特定于psql的功能,或者是单个反斜杠命令。

© www.soinside.com 2019 - 2024. All rights reserved.