如何在 PostgreSQL 的 DROP/CREATE/INSERT 语句中简洁地使用 SET 变量?

Posted

技术标签:

【中文标题】如何在 PostgreSQL 的 DROP/CREATE/INSERT 语句中简洁地使用 SET 变量?【英文标题】:How can I use a SET variable concisely in a DROP/CREATE/INSERT statements in PostgreSQL? 【发布时间】:2020-12-18 14:22:24 【问题描述】:

我有一个迁移脚本模板,我们在需要时使用新版本运行该模板。是这样的:

SET "myapp.user"='someuser'; --This line CANNOT change

DROP TABLE IF EXISTS backup_tables.someuser_parameter;
CREATE TABLE backup_tables.someuser_parameter AS SELECT * FROM "public".parameter;

INSERT INTO "public".parameter (key, value, enabled)
    SELECT
        'task_name',
        (
            '"worker_config": "crontab": "hour": "0", "minute": "1", "disabled": false, "periodic_task": true, "username": "' || current_setting('myapp.user') || '"'
        )::JSONB,
    TRUE;

如您所见,myapp.user 值 (someuser) 在脚本中的三个位置使用。

    有没有更优雅的方式在 INSERT 中使用 myapp.user? 如何在 DROP TABLE 和 CREATE TABLE 语句中使用 myapp.user?

如果 PostgreSQL 9.4.14 有所改变,我会使用它。

【问题讨论】:

您将需要一个匿名 pl/pgsql 块和用于 DDL 命令的动态 SQL。 IE。 execute format('DROP TABLE IF EXISTS backup_tables.%I', current_setting('myapp.user')); 之类的东西你可以将current_setting('myapp.user') 分配给 pl/pgsql 块中的文本变量,这可能会使代码更易于阅读。 【参考方案1】:
SET "myapp.user"='someuser'; --This line CANNOT change

do language plpgsql
$$
declare
  myapp_user text := current_setting('myapp.user');
begin
  execute format('DROP TABLE IF EXISTS backup_tables.%I', myapp_user);
  execute format('CREATE TABLE backup_tables.%I AS SELECT * FROM "public".parameter', myapp_user);

  INSERT INTO "public".parameter (key, value, enabled)
    SELECT
        'task_name',
        (
            '"worker_config": "crontab": "hour": "0", "minute": "1", "disabled": false, "periodic_task": true, "username": "' || myapp_user || '"'
        )::JSONB,
        TRUE;
end;
$$;

【讨论】:

以上是关于如何在 PostgreSQL 的 DROP/CREATE/INSERT 语句中简洁地使用 SET 变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PostgreSQL 中记录“准备”语句?

PostgreSQL介绍以及如何开发框架中使用PostgreSQL数据库

如何解决这个问题 - 无法在 org.postgresql:postgresql:jar:42.2.4 收集依赖项

如何在 Windows 10 中安装 PostgreSQL 和连接设置

如何在 hsql 中编写 postgresql 查询

如何在 PostgreSQL 中更改视图