当前位置: 首页 > 知识库问答 >
问题:

如何在Postgres脚本中使用变量?

沃侯林
2023-03-14
\set schema_name 'example_schema'

\echo 'The Schema name is' :schema_name

\ir sql/file1.pgsql
\ir sql/file2.pgsql
CREATE OR REPLACE FUNCTION :schema_name.get_things_by_category(...

由于我不知道的原因,这在我的最新函数中不起作用:

CREATE OR REPLACE FUNCTION :schema_name.update_thing_details(_id uuid, _details text)
    RETURNS text
    LANGUAGE 'plpgsql'
AS $BODY$

BEGIN
    UPDATE :schema_name.things
    ...

语法错误表明它在update之后按字面意思解释:schema_name,而不是展开它。我如何让它在这里使用变量值而不是文字值?我知道在begin...end中可能是一个不同的上下文,但肯定有一种方法可以在所有地方编写这个模式名的脚本?

共有1个答案

柳玄裳
2023-03-14

我可以想到三种方法,因为PSQL不能直接做到这一点。

Shell脚本

使用bash脚本执行变量替换,并将结果管道到psql中,例如。

#!/bin/bash

$schemaName = $1
$contents = `cat script.sql | sed -e 's/@SCHEMA_NAME@/$schemaName'`

echo $contents | psql

入口点可以是bash中的一个内联脚本,该脚本通过管道传输到psql,预先更新默认连接模式,然后使用\ir包括所有.sql文件,这些文件不应指定模式。

#!/bin/bash

$schemaName = $1

psql <<SCRIPT
SET search_path TO $schemaName;
\ir sql/file1.pgsql
\ir sql/file2.pgsql
SCRIPT

一些细节:如何在使用PSQL时选择postgres中的模式?

就我个人而言,我倾向于后一种方法,因为它似乎是最简单和最可伸缩的。

 类似资料:
  • 拉斯宾(杰西)-root@RaspberryPi-腻子 在我输入的终端中 现在我得到了一个包含此代码的脚本 有一个cronjob每小时启动一次这个脚本 苏。一定有什么地方出错了。因为他将变量$finalanswer解读为nothing。 这意味着在此脚本之外定义的变量将不起作用? 我该如何解决这个问题?

  • 问题内容: 是否可以在.sql文件中使用Linux环境变量?我正在使用复制/选择查询来写入输出文件,并且我想将该目录放入变量中。所以我想做这样的事情: Outputdir将在我的环境中设置。这可能吗? 问题答案: 您可以将shell命令的结果存储在这样的变量中: 您的案例的一个例子是: 请注意,在示例中,您需要在脚本文件中设置变量,但是如果在调用时设置了第一行,则可以跳过第一行:

  • 我的问题是spring版本没有被识别为可变版本。那么我如何在字符串内部传递它呢?

  • 问题内容: 我一直在尝试通过创建自定义用户和数据库来为开发postgres实例设置容器。我正在使用官方的postgres docker镜像 。在文档中,它指示您在文件夹内插入bash脚本以使用任何自定义参数设置数据库。 我的bash脚本:make_db.sh Docker文件 我从(db是我的容器名称)得到的错误是: createuser:无法连接到数据库postgres:无法连接到服务器:没有这

  • CreateUser:无法连接到数据库postgres:无法连接到服务器:没有这样的文件或目录 似乎在启动postgres之前正在执行文件夹中的命令。我的问题是,我如何使用官方的postgres容器以编程方式设置用户/数据库?有没有办法用脚本做到这一点?

  • 我有一个selenium脚本,它在一个财务web应用程序上创建一个财务配置文件。现在我需要检查添加的财务资料是否出现在配置文件中。 例如,我在配置文件中添加了一个退休帐户,并希望查看添加的退休帐户是否出现在配置文件中。我已经检查了UI元素以验证它是否出现在配置文件中。但是我想知道是否有一种方法可以使用javascript变量来检查相同的内容。 我还读过一些扩展,这些扩展可以向您展示称为real t