我如何移动这个psql代码运行的bash到一个常规的.sql文件?



我正在将不必要的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文件的唯一更改是将$$更改为$$在它存在的两个地方。

顺便说一下,bash代码只需要转义,因为脚本使用了未加引号的heredoc符号。如果它使用<<-'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

最新更新