Movable TypeのPerl APIを使って移行作業

やりたいこと

(1) 移行元のMovable TypeのデータをYAMLでダンプ
    ↓
(2) YAMLを移行先サーバに転送
    ↓
(3) 移行先のMovable TypeYAMLをインポート

ここまでやります。

投稿者をダンプ&インポートする

まず全投稿者をダンプしてみます。
以降の説明では 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 TypePerl API は大変よくできていて素晴らしいです。