postgresql COPY コマンドを使用して CSV からデータを読み込もうとしています。秘訣は、(CSV に含まれている) ユーザー ID にマルチテナンシーを実装したいということです。csv をロードするときに、このユーザー ID に基づいてフィルタリングするように postgres copy コマンドに指示する簡単な方法はありますか?
つまり、userid=x のすべての行は schema=x に移動し、userid=y の行は schema=y に移動します。
postgresql COPY コマンドを使用して CSV からデータを読み込もうとしています。秘訣は、(CSV に含まれている) ユーザー ID にマルチテナンシーを実装したいということです。csv をロードするときに、このユーザー ID に基づいてフィルタリングするように postgres copy コマンドに指示する簡単な方法はありますか?
つまり、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 を実行して行が移動され、最後に移動された行が削除されます。