【问题标题】:How to pass environment variables to a sql file from bash shell (PostgreSQL)如何从 bash shell (PostgreSQL) 将环境变量传递给 sql 文件
【发布时间】: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_NAMEDATABASE_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 CommandsCREATE USER 是一个实用命令,完整的命令需要以文本形式构建。
  • @AdrianKlaver 我已经查看了该文档,但似乎仍然无法正常工作。

标签: sql postgresql bash psql


【解决方案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";

【讨论】:

  • 不幸的是,两者都不起作用,他们仍然在语法问题上出错:
  • 是的,简短的版本是 psql 变量不会在 plpgsql 函数中扩展,每个帖子 Variables 指向此 SO Post 以寻求可能的解决方法。
  • @AdrianKlaver 将参数传递给匿名 plsql 块似乎是not possible。我会用一个函数来查看答案...
  • 传入参数和使用设置变量是两个不同的东西。任何语言的匿名函数都不能带参数。设置变量不能在函数中使用,无论是否匿名。
猜你喜欢
  • 2017-03-06
  • 2018-02-04
  • 1970-01-01
  • 2011-09-18
  • 2012-12-17
  • 2018-04-09
  • 2019-11-08
  • 2015-05-21
  • 2013-11-08
相关资源
最近更新 更多