火曜日, 2月 08, 2011

MySQL一つで複数のMTをインストールする方法。





よくありがちなパターンですが、MySQLのDBがひとつしかないホスティングサービス上で、
複数のMTをインストールする方法がありますのでご紹介。


◇ 実施した環境
MT 5.0.4
MySQL 5.1.50



変更が必要なファイルは以下の3つ:

  • lib/MT/ObjectDriver/Driver/DBI.pm
  • lib/MT/ObjectDriver/Driver/DBD/Legacy.pm
  • lib/MT/ObjectDriver/Driver/DBD/Pg.pm

DBI.pm(16-30行目)


sub init {
    my $driver = shift;
    my (%param) = @_;
    $param{prefix} ||= 'mt5_';
    $driver->SUPER::init(%param);
    my $opts = $driver->connect_options || {};

    require MT;
    my $mt = MT->instance;
    my $cfg = $mt->config;
    $opts->{RaiseError} = $cfg->DBIRaiseError;

    $driver->connect_options($opts);
    $driver;
}


Legacy.pm(47-52行目)

sub db_column_name {
    my $dbd = shift;
    my ($table, $col) = @_;
    $table =~ s{ \A mt5_ }{}xms;
    return join('_', $table, $col);
}


Pg.pm(128-141行目)

sub sequence_name {
    my $dbd = shift;
    my($class) = @_;

    my $key = $class->properties->{primary_key};
    ## If it's a complex primary key, use the second half.
    if(ref $key) {
        $key = $key->[1];
    }

    # mt_tablename_columnname
    return join '_', 'mt5',
        $dbd->db_column_name(MT::Object->driver->table_for($class), $key);
}

※参考にしたサイト

で、実際のDBを走らせてみたらなんと!
DBに新しいフィールドが出来てるじゃないですか!!

DBの登録もキチンとされているし、MTの動きも問題ない。
取り敢えずこのまま運用を続けてみることにします。



これを実施する前にかならず現状のDBバックアップを取ってください。
また、これにより復元できない、エラーが起きたとしても当方は責任持てませんのであしからず。