Movable TypeのPerl APIを使って移行作業
やりたいこと
(1) 移行元のMovable TypeのデータをYAMLでダンプ ↓ (2) YAMLを移行先サーバに転送 ↓ (3) 移行先のMovable TypeでYAMLをインポート
ここまでやります。
投稿者をダンプ&インポートする
まず全投稿者をダンプしてみます。
以降の説明では Movable Type を /var/www/html/mt3-cgi にインストールしたものと仮定しています。別のディレクトリにインストールした場合は読み替えてください。
すべての投稿者をダンプするスクリプト: dump_authors.pl
#!/usr/bin/perl use strict; use warnings; use lib qw(/var/www/html/mt3-cgi/lib); use MT; use MT::Author; use YAML::Syck; # カレントディレクトリがMTのインストールディレクトリではない(mt-config.cgiがない)場合は # mt-config.cgi へのパスを指定する my $mt = MT->new( Config => '/var/www/html/mt3-cgi/mt-config.cgi' ); # load() の () 内に検索条件を指定しなければ全件取得 my @authors = MT::Author->load(); # YAMLでダンプする print Dump @authors;
移行元サーバでこのスクリプトを実行します。
% ./dump_authors.pl > authors.yaml
この authors.yaml を移行先サーバに転送します。
次に、投稿者をインポートするスクリプト: import_authors.pl
#!/usr/bin/perl use strict; use warnings; use lib qw(/var/www/html/mt3-cgi/lib); use MT; use MT::Author; use YAML::Syck; # カレントディレクトリがMTのインストールディレクトリではない(mt-config.cgiがない)場合は # mt-config.cgi へのパスを指定する my $mt = MT->new( Config => '/var/www/html/mt3-cgi/mt-config.cgi' ); # 標準入力(STDIN)からYAMLデータを読み込む my $yamlstr = join('', <>); # オブジェクトに戻す my @authors = Load($yamlstr); foreach my $author (@authors) { # $author->save で投稿者が登録されます $author->save or die $author->errstr; }
さきほどの authors.yaml を読み込ませてスクリプトを実行します。
% ./import_authors.pl < authors.yaml
この要領です。そんなに難しくないですよね?
カテゴリをダンプ&インポートする
カテゴリは MT::Category を使います。
ダンプするスクリプトはこんな風になります。
# 全カテゴリを取得 my @cats = MT::Category->load(); # ダンプ print Dump @cats;
インポートするスクリプトも同様です。
# YAMLをロード my $yamlstr = join('', <>); my @cats = Load($yamlstr); print Dumper(@cats); foreach my $cat (@cats) { # $cat->save でカテゴリが登録されます $cat->save or die $cat->errstr; }
ほかにもいろいろありまっせ
同様にブログ一覧はMT::Blogで移行できます。使い方は MT::Blogのドキュメント にあります。
このほかにもテンプレートやプラグインデータなど一通りPerl APIが用意されていて大変お手軽です。
参考: Movable Type オブジェクト・リファレンス
大量のデータをインポートするとき
データが大量にあるときはYAMLのロードでたくさんメモリ食っちゃって大変です。
なので1件ずつ逐次パースしてインポートしていくといいと思います。こんな感じで
my $buf; while (<>) { if ($_ eq "--- \n" && $buf) { my $data = Load($buf); &process_data($data); $buf = ''; } $buf .= $_; } sub process_data { my $data = shift; # $data をインポートするなどの処理 }
結論
Movable Type の Perl API は大変よくできていて素晴らしいです。