如何在 PostgreSQL 的 DROP/CREATE/INSERT 语句中简洁地使用 SET 变量?
How can I use a SET variable concisely in a DROP/CREATE/INSERT statements in PostgreSQL?
我有一个迁移脚本模板,我们 运行 在需要时使用新版本。它是这样的:
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 有所改变,我会使用它。
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;
$$;
我有一个迁移脚本模板,我们 运行 在需要时使用新版本。它是这样的:
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 有所改变,我会使用它。
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;
$$;