如何在PostgreSQL SQL脚本中使用Linux系统环境变量
如何在PostgreSQL SQL脚本中使用Linux系统环境变量
我懂你碰到的麻烦了——直接在SQL脚本里写$PASSWORD的话,psql会把它当成PostgreSQL自己的变量来解析,根本不会去读Linux系统里的环境变量,自然就不会替换成实际值啦。下面给你几个实用的解决办法,你可以挑适合自己的来用:
方法一:用psql的-v参数传递环境变量
这是最稳妥的方式,能避免SQL注入风险,而且兼容性好。
- 先修改你的SQL脚本,把原来的
'$PASSWORD'改成带冒号的变量引用写法:
alter user airflow with password :'PASSWORD';
这里的:PASSWORD是psql的变量引用,加单引号的话,psql会自动帮你处理特殊字符的转义,安全性拉满。
- 执行脚本的时候,用
-v参数把Linux环境变量传递给psql:
psql -h XXX -p 5432 -U XXX -d XXX -v PASSWORD="$PASSWORD" -f ./script.sql
这样psql就会把脚本里的:PASSWORD替换成系统中$PASSWORD的实际值了。
方法二:用shell的envsubst预处理脚本
如果不想改脚本里的写法,还可以用shell工具先把脚本里的环境变量替换掉,再传给psql执行。
直接执行这条命令就行:
envsubst < ./script.sql | psql -h XXX -p 5432 -U XXX -d XXX
envsubst会把脚本里所有的$PASSWORD替换成系统环境变量的数值,然后把处理后的内容传给psql执行。
⚠️ 注意:如果你的脚本里本来就有PostgreSQL的变量(比如$1、$var这类),envsubst可能会把它们也替换掉,导致出错。这时候可以指定只替换特定的环境变量:
envsubst '$PASSWORD' < ./script.sql | psql -h XXX -p 5432 -U XXX -d XXX
这样就只会替换$PASSWORD,不会影响其他变量了。
方法三:在SQL脚本中直接读取环境变量(PostgreSQL 12+)
如果你用的是PostgreSQL 12或更高版本,psql支持用\getenv元命令直接读取Linux环境变量,不用改命令行参数。
修改你的SQL脚本,在开头加上这一行:
\getenv PASSWORD PASSWORD
然后后面的语句还是用:PASSWORD的写法:
alter user airflow with password :'PASSWORD';
这样执行脚本的时候,psql会自动读取系统里的$PASSWORD环境变量,赋值给psql内部的PASSWORD变量,再替换到语句里。
备注:内容来源于stack exchange,提问作者Karim AREZKI
相关产品推荐
相关产品推荐

