如何将此 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
我正在转换不必要的 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