运行 不同架构下的相同脚本 - postgres
Run same script on under different schema - postgres
我有一个名为 populate.sql
的脚本,其中包含创建表。
CREATE TABLE "EXAMPLE" (
.................
..............
);
CREATE TABLE "BlaBla" (
..........
........
);
CREATE TABLE ...
此脚本创建了 20 多个表。我想 运行 这个 populate.sql
在不同的模式之上。假设我想在 schema1
、schema2
和 schema3
.
上 运行 这个脚本
那我就可以写了;
CREATE SCHEMA IF NOT EXISTS "schema1";
SET SCHEMA 'schema1';
在 populate.sql
上并在 one 架构上创建这些表。
如何在一个 psql 命令中在所有模式上创建这些表?
据我所知,我必须在 psql 上执行 FOR 循环并首先创建架构,然后在该架构之上创建表。
表将在当前设置 search_path 中创建(如果没有在创建语句中特别设置)。
您可以使用循环。在该循环中,您必须将搜索路径设置为您的模式。
DO
$$
DECLARE schemaname text;
BEGIN
FOR i IN 1..3 LOOP
schemaname := 'schema' || i::text;
execute 'CREATE SCHEMA ' || schemaname;
execute 'SET SCHEMA ' || schemaname;
execute 'SET search_path TO ' || schemaname;
-- conent of populate.sql
END LOOP;
END
$$;
如评论中 所述,您不能在此 do block
中调用外部脚本。因此,只有当你想扩展你的 populate.sql
文件并将这个 do block
包裹在它周围时,这个答案才有意义。
我有一个名为 populate.sql
的脚本,其中包含创建表。
CREATE TABLE "EXAMPLE" (
.................
..............
);
CREATE TABLE "BlaBla" (
..........
........
);
CREATE TABLE ...
此脚本创建了 20 多个表。我想 运行 这个 populate.sql
在不同的模式之上。假设我想在 schema1
、schema2
和 schema3
.
那我就可以写了;
CREATE SCHEMA IF NOT EXISTS "schema1";
SET SCHEMA 'schema1';
在 populate.sql
上并在 one 架构上创建这些表。
如何在一个 psql 命令中在所有模式上创建这些表?
据我所知,我必须在 psql 上执行 FOR 循环并首先创建架构,然后在该架构之上创建表。
表将在当前设置 search_path 中创建(如果没有在创建语句中特别设置)。
您可以使用循环。在该循环中,您必须将搜索路径设置为您的模式。
DO
$$
DECLARE schemaname text;
BEGIN
FOR i IN 1..3 LOOP
schemaname := 'schema' || i::text;
execute 'CREATE SCHEMA ' || schemaname;
execute 'SET SCHEMA ' || schemaname;
execute 'SET search_path TO ' || schemaname;
-- conent of populate.sql
END LOOP;
END
$$;
如评论中 do block
中调用外部脚本。因此,只有当你想扩展你的 populate.sql
文件并将这个 do block
包裹在它周围时,这个答案才有意义。