如何将此 psql 代码 运行 by bash 移动到常规 .sql 文件中?

How can I move this psql code run by bash into a regular .sql file?

我正在转换不必要的 shell 脚本以在 Docker 容器中滋润数据库,方法是将它们移动到一个 init 文件我计划从 postgres 映像加载到 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 函数,或者如果它已经存在,则用一个新的定义更新它。由于 questions asking code to be explained are too broad to be on-topic here 除非他们进行了大量研究并确定了一个具体的、狭隘的问题,否则我不会进一步讨论这个问题。


您需要能够将 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