如何在PostgreSQL初始化SQL脚本中引用Shell变量?
解决PostgreSQL SQL脚本中Shell变量替换失败的问题
问题分析
核心问题是SQL脚本中变量引用方式错误,导致PostgreSQL无法识别正确的角色名;同时Shell脚本的变量声明存在不规范的地方。
修正后的Shell脚本
export DB_HOST="xxx" export DB_PORT="xxx" export DB_USER="xxx" export DB_NAME="xxx" psql -U "$DB_USER" -d "$DB_NAME" -v user1="$DB_USER" -f initialize_postgres.sql
- 移除无意义的单独
export行,给每个变量加上export确保变量能被子进程识别; - 给
$DB_USER等变量添加双引号,避免变量值包含空格或特殊字符时出现解析错误。
修正后的SQL脚本
GRANT SELECT, INSERT, DELETE, UPDATE ON ALL TABLES IN SCHEMA public TO :"user1"; GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO :"user1"; CREATE FUNCTION save_property (IN prop varchar(50), IN val varchar(500)) RETURNS void AS $$ UPDATE properties SET "value"=val WHERE id=prop; INSERT INTO properties (id, value) SELECT prop, val WHERE NOT EXISTS (SELECT 1 FROM properties WHERE id=prop); $$ LANGUAGE sql; GRANT EXECUTE ON FUNCTION public.save_property(varchar(50),varchar(500)) TO :"user1";
- 将
:'user1'改为:"user1":原写法会被解析为带单引号的字符串常量,PostgreSQL会尝试查找名为'xxx'(带单引号)的角色,显然不存在;新写法会被解析为合法标识符,psql会自动将变量值替换为正确的角色名,兼容所有合法的角色命名(包括含大写、特殊字符的情况)。
内容的提问来源于stack exchange,提问作者Sumit Bhardwaj
相关产品推荐
相关产品推荐

