1

postgresql COPY コマンドを使用して CSV からデータを読み込もうとしています。秘訣は、(CSV に含まれている) ユーザー ID にマルチテナンシーを実装したいということです。csv をロードするときに、このユーザー ID に基づいてフィルタリングするように postgres copy コマンドに指示する簡単な方法はありますか?

つまり、userid=x のすべての行は schema=x に移動し、userid=y の行は schema=y に移動します。

4

1 に答える 1

2

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 を実行して行が移動され、最後に移動された行が削除されます。

于 2012-12-07T17:03:08.790 に答える