[英]How to pass environment variables to a sql file from bash shell (PostgreSQL)
我需要能够传递环境变量,从 bash shell 使用psql
执行.sql
文件。
我正在运行的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
的 Output 是psql (PostgreSQL) 12.6 (Ubuntu 12.6-0ubuntu0.20.04.1)
没有 PLSQL,它似乎工作:
\connect postgres
DROP DATABASE IF EXISTS :dbname;
CREATE USER :dbuser;
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";
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.