我正在尝试使用 postgresql COPY 命令从 CSV 加载一些数据。诀窍是我想在用户标识(包含在 CSV 中)上实现多租户。在加载 csv 时,是否有一种简单的方法可以告诉 postgres 复制命令根据此用户 ID 进行过滤?
即所有带有userid=x 的行转到schema=x,带有userid=y 的行转到schema=y。
我正在尝试使用 postgresql COPY 命令从 CSV 加载一些数据。诀窍是我想在用户标识(包含在 CSV 中)上实现多租户。在加载 csv 时,是否有一种简单的方法可以告诉 postgres 复制命令根据此用户 ID 进行过滤?
即所有带有userid=x 的行转到schema=x,带有userid=y 的行转到schema=y。
仅使用 COPY 命令无法做到这一点,但您可以将所有数据复制到主表中,然后组合一个简单的 PL/PGSQL 函数为您完成此操作。像这样的东西-
CREATE OR REPLACE FUNCTION public.spike()
RETURNS void AS
$BODY$
DECLARE
user_id integer;
destination_schema text;
BEGIN
FOR user_id IN SELECT userid FROM master_table GROUP BY userid LOOP
CASE user_id
WHEN 1 THEN
destination_schema := 'foo';
WHEN 2 THEN
destination_schema := 'bar';
ELSE
destination_schema := 'baz';
END CASE;
EXECUTE 'INSERT INTO '|| destination_schema ||'.my_table SELECT * FROM master_table WHERE userid=$1' USING user_id;
-- EXECUTE 'DELETE FROM master_table WHERE userid=$1' USING user_id;
END LOOP;
TRUNCATE TABLE master_table;
RETURN;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
这会从 master_table 中获取所有唯一的 user_id,使用 CASE 语句确定目标模式,然后执行 INSERT SELECT 移动行,最后删除移动的行。