DBIx::Class::Storage::DBI::mysql::backup

先月、CPAN に公開したモジュール DBIx::Class::Storage::DBI::mysql::backup の紹介です。

DBIx::Class::Schema::Versioned にある、backup_directory という設定項目は、設定すると backup メソッドをコールするだけで、設定したディレクトリにバックアップを作成してくれるのだろうな、と思いますが、実は、SQLite など ( 他の DBI は確認してません ) 、DBIx::Class::Storage::DBI のサブクラス側で各々実装するものらしく、MySQL で backup メソッドをコールすると、以下の様に die してしまいます。

Can't locate object method "backup" via package "DBIx::Class::Storage::DBI"
    at /path/to/lib/site_perl/5.xx.x/DBIx/Class/Schema/Versioned.pm line 560.

SYNOPSIS に書いた様に、Storage::DBI::mysql::backup を、Schema.pm ( DBIx::Class::Schema のサブクラス ) の load_components に加えて下さい。

package MyApp::Schema;
use base qw/DBIx::Class::Schema/;
our $VERSION = 0.001;
__PACKAGE__->load_classes(qw/CD Book DVD/);
__PACKAGE__->load_components(qw/
  Schema::Versioned
  Storage::DBI::mysql::backup
/);
__PACKAGE__->upgrade_directory("/path/to/var/upgrade");
__PACKAGE__->backup_directory("/path/to/var/backup");

これで backup メソッドをコールしても die しなくなりました。

my $schema = MyApp::Schema->connect(
  'DBI:mysql:myapp_db',
  'myapp_user',
  'myapp_pass' );
$schema->do_backup( 1 ); # これが必要
$schema->backup;

backupdirectory で 設定したディレクトリに、myappdb-20110202-050441.sql という名前で、ダンプデータが作成されていると思います。

よかったら、是非、使ってみてください。

$ cpanm DBIx::Class::Storage::DBI::mysql::backup

or checkout from GitHub

$ git clone git://github.com/ngs/p5-dbix-class-storage-dbi-mysql-backup.git
$ cd p5-dbix-class-storage-dbi-mysql-backup
$ perl Makefile.PL
$ make test
$ make install

 

テストコードを書くに当たって、Test::mysqld というモジュールを使わせて頂きました。

mysql.sock をテスト用に作成して、テストが完了すると、自動的に削除してくれるので、実際動いている DB に干渉せず、安心して開発ができました。

comments powered by Disqus