如何从 bash shell (PostgreSQL) 将环境变量传递到 sql 文件

Ada*_*rds 7 postgresql psql bash

我需要能够从.sql使用 .bashrc 执行文件的 bash shell 传递环境变量psql

psql我正在运行的命令是:

su postgres -c "psql -v ON_ERROR_STOP=1 -v dbname=example -v dbuser=example -e" < ./create-db.sql
Run Code Online (Sandbox Code Playgroud)

我放置的位置example通常分别设置为$DATABASE_NAMEDATABASE_USER,在执行命令之前在 bash 脚本中设置psql

create-db.sql文件是:

\connect postgres
DROP DATABASE IF EXISTS :dbname;
DO $$BEGIN
    CREATE USER :dbuser;
EXCEPTION WHEN duplicate_object THEN
    RAISE NOTICE 'user already exists';
END$$;
ALTER ROLE :"dbuser" SET search_path TO :"dbname",public;
CREATE DATABASE :"dbname"
    OWNER=:dbuser
    ENCODING=UTF8
    LC_COLLATE='en_US.UTF-8'
    LC_CTYPE='en_US.UTF-8'
    TEMPLATE=template0;
\connect :"dbname"
CREATE SCHEMA zulip AUTHORIZATION :"dbuser";
Run Code Online (Sandbox Code Playgroud)

该行中的变量替换DROP DATABASE IF EXISTS :dbname;有效,但是该CREATE USER :dbuser;行失败后的所有内容都失败了,我已经尝试了以下每种方法:

CREATE USER :dbuser; CREATE USER :'dbuser'; CREATE USER :"dbuser";

它总是出错:

You are now connected to database "postgres" as user "postgres".
DROP DATABASE IF EXISTS example;
NOTICE:  database "example" does not exist, skipping
DROP DATABASE
DO $$BEGIN
    CREATE USER :dbuser;
EXCEPTION WHEN duplicate_object THEN
    RAISE NOTICE 'user already exists';
END$$;
ERROR:  syntax error at or near ":"
LINE 2:     CREATE USER :dbuser;
                        ^
Run Code Online (Sandbox Code Playgroud)

我真的不确定上面的内容哪里错了。的输出psql -Vpsql (PostgreSQL) 12.6 (Ubuntu 12.6-0ubuntu0.20.04.1)

Ger*_*lle 2

这将使您能够做到这一点。在您的情况下,“$$”之间的所有内容都是“美元引用的字符串常量,因此不会解释任何内容。请参阅sql 语法,4.1.2.4。

\set CREDO 'begin create user ' :dbuser '; exception when duplicate_object then raise notice ''user already exists''; end';
do :'CREDO';
Run Code Online (Sandbox Code Playgroud)