Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

プレーンなdumpファイルから特定条件のデータだけimportする

個人用メモ。

データ移行とかテスト用DB構築のため、dumpファイルを使うことが多いのですが、特定条件を満たすデータだけを移行したい場合があります。こんな場合の王道(?)は

  • dumpファイルをimportして、いらないデータをDELETEする

かと思いますが、HDD容量とかの関係でできない場合もあります。
そんな時は、データを間引いたdumpファイルを作ってそれをimportするようにしています。dumpファイルは基本的にテキストなので、grepでパターンを指定してやれば目的のデータは抽出できます。あとは、dumpファイルのヘッダ(先頭からCOPYコマンドまで)を抽出データの先頭にコピーしてやればOK。ヘッダはこんな感じ。

--
-- PostgreSQL database dump
--

SET client_encoding = 'EUC_JP';
SET standard_conforming_strings = off;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET escape_string_warning = off;

SET search_path = test, pg_catalog;

--
-- Data for Name: sample_table; Type: TABLE DATA; Schema: test; Owner: test
--

COPY sample_table (column1, column2, column3) FROM stdin;

コマンドでやると、こんな感じ。

$ head -n 17 sample_table.dmp > import_data.dmp
$ grep -E "[パターン]" sample_table.dmp >> import_data.dmp
$ psql -U xxxx test_db < import_data.dmp

PostgreSQLで「dumpファイル」とか「import」という言葉を使うかどうかは自信ないですが。。。