如何将bash脚本中运行的psql代码转换为标准.sql文件
原Shell脚本作用
这段脚本是调用Postgres官方客户端psql执行SQL语句的封装逻辑,各部分作用拆解:
-v ON_ERROR_STOP=1:开启执行报错立即终止的规则,避免出错后后续无效逻辑继续运行--username "$POSTGRES_USER":读取容器内置的管理员用户环境变量登录数据库--dbname "test":指定连接test数据库执行操作<<-EOSQL到末尾的EOSQL是Shell的Here Document语法,中间包裹的是要执行的SQL逻辑:创建/替换publicschema下的user_session_register存储函数,函数接受3个参数(必填的用户IDu_id、可选的IP地址ip、可选的访问路径path),返回布尔值;当前简化版逻辑是执行成功返回true,捕获所有异常后返回false,实际生产使用时通常会在BEGIN和EXCEPTION之间补充插入会话记录的核心逻辑。
转换为独立SQL初始化文件的方法
转换逻辑非常简单,只需要提取Here Document标记中间的纯SQL内容,原封不动存为.sql后缀的文件即可,不需要做任何转义修改,示例文件01-init-session-func.sql内容如下:
CREATE or replace FUNCTION public.user_session_register(u_id integer, ip text DEFAULT NULL::text, path text DEFAULT NULL::text) RETURNS boolean LANGUAGE plpgsql AS $$ BEGIN RETURN true; EXCEPTION WHEN OTHERS THEN RETURN false; END $$;
如果需要指定在test库执行该SQL,可以在文件第一行添加切换库的命令:
\c test;
将修改后的SQL文件放到Postgres镜像的/docker-entrypoint-initdb.d目录下即可,容器首次初始化时会自动以管理员身份执行该文件,执行报错时默认会终止初始化流程,和原脚本的ON_ERROR_STOP=1效果一致。
内容的提问来源于stack exchange,提问作者Branden
相关产品推荐
相关产品推荐

