【发布时间】:2021-06-24 21:00:15
【问题描述】:
我需要能够从使用psql 执行.sql 文件的bash shell 传递环境变量。
我正在运行的psql 命令是:
su postgres -c "psql -v ON_ERROR_STOP=1 -v dbname=example -v dbuser=example -e" < ./create-db.sql
我将example 放置的位置通常分别设置为$DATABASE_NAME 和DATABASE_USER,这是在执行psql 命令之前在bash 脚本中设置的。
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";
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;
^
我真的不确定上述内容哪里出错了。 psql -V 的输出是 psql (PostgreSQL) 12.6 (Ubuntu 12.6-0ubuntu0.20.04.1)
【问题讨论】:
-
阅读此部分Dynamic Commands。
CREATE USER是一个实用命令,完整的命令需要以文本形式构建。 -
@AdrianKlaver 我已经查看了该文档,但似乎仍然无法正常工作。
标签: sql postgresql bash psql