我正在将不必要的shell脚本转换为在Docker容器中填充数据库,方法是将它们移动到我计划从postgres映像加载到init目录的init文件中。
我被困在这个shell脚本
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "test" <<-EOSQL
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
$$;
我想了解它在做什么,以及如何将其转换为我的。sql文件中的标准查询。
代码所做的正是它看起来在做的事情:它在数据库中定义了一个SQL函数,或者如果它已经存在,则使用新定义更新它。由于要求解释代码的问题过于宽泛,除非它们显示了大量的研究并确定了一个特定的、狭窄的问题,否则无法在这里讨论,因此我不会进一步深入讨论。
您需要能够复制heredoc的主体(<<-EOSQL
之后和EOSQL
之前的行)到.sql文件的唯一更改是将$$
更改为$$
在它存在的两个地方。
<<-'EOSQL'
而不是<<-EOSQL
,那么shell脚本可以使用常规的$$
,您根本不需要更改任何内容。
谢谢,把它改成这个在我的初始化文件
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
$$;
如果你改变
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "test" <<-EOSQL
cat <<-EOSQL
你将得到没有转义的SQL代码。
要捕获重定向输出到另一个文件,您可以在子shell中执行以下代码:
(cat <<-EOSQL
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
$$;
EOSQL
) > sql.sql