Perl Hackers Hub
第37回 PerlでInfrastructure as Code―IaaSやSaaSをコードで自動化(3)
データベースのマイグレーション
狭義のInfrastructure as Codeには含まれないかもしれませんが,
なお,
スキーマをPerlのDSLで表現する──DBIx::Schema::DSL
DBIx::Schema::DSLは,
リスト6は,book
というテーブルと,id
とname
というカラムを定義しています。id
カラムはプライマリキーでかつオートインクリメントが,name
カラムはNOT NULL制約が,
リスト6 DBIx::Schema::DSLを利用したスキーマ定義
package My::Schema;
use DBIx::Schema::DSL;
create_table 'book' => columns {
integer 'id', primary_key, auto_increment;
varchar 'name', not_null;
};
1;
DBIx::Schema::DSLを利用して定義したスキーマからDDLを取得する場合,
use My::Schema;
print My::Schema->output;
このスクリプトを実行すると,
SET foreign_ key_ checks=0;
CREATE TABLE `book` (
`id` INTEGER NOT NULL auto_ increment,
`name` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8;
SET foreign_ key_ checks=1;
なお,database
を利用してRDBMSを指定しなければなりません。次のコードでは,
package My::Schema;
use DBIx::Schema::DSL;
database 'SQLite';
このほかDBIx::Schema::DSLでは,
スキーマの差分を取得する──SQL::Translator::Diff
先述したとおり,
リスト7 (1)は,
リスト7 スキーマの差分表示とマイグレーションのスクリプト例
use DBI;
use SQL::Translator;
use SQL::Translator::Diff;
use My::Schema;
# (1)DBIx::Schema::DSLで定義したスキーマの取得
my $target = My::Schema->translator();
# (2)データベースからのスキーマの取得
my $dbh = DBI->connect( ... );
my $source = SQL::Translator->new(
parser => 'DBI',
parser_args => { dbh => $dbh },
)->translate();
# (3)スキーマの差分の取得
my $diff = SQL::Translator::Diff->new({
output_db => 'MySQL',
target_schema => $target->schema(),
source_schema => $source,
})->compute_differences->produce_diff_sql;
# (4)差分の適用(マイグレーション)
for my $stmt (split /;/, $diff) {
next unless $stmt =~ /\S/;
$dbh->do($stmt) or die $dbh->errstr();
}
これで,$target
と,$source
という2つのSQL::Translatorのオブジェクトを利用して,
SQL::Translator::Diffは,source_
で与えた現在の状態のスキーマが,target_
で与えたあるべき状態のスキーマになるために必要な変更ALTER TABLE
やCREATE TABLE
などのクエリの実行)
そのため,
とはいえ,
チャットツールへの通知
Infrastructure as Codeを実施するにあたり,
本節では,
HipChatへの通知──WebService::HipChat
リスト8は,
リスト8 HipChatへの通知のスクリプト例
use WebService::HipChat;
# (1)WebService::HipChatのオブジェクト生成
my $hc = WebService::HipChat->new(
auth_token => 'token',
);
# (2)HipChatへの通知の実施
$hc->send_notification($room, {
color => 'green',
message => 'hello!',
});
まず,auth_
でHipChatのAPIトークンを与える必要があります。注意点として,
実際の通知の実施は,send_
メソッドで行います。第1引数には通知を行うHipChat上のルームのAPI IDを,hello!
という文字列を通知しています。
Slackへの通知──WebService::Slack::WebApi
一方,
HipChatの例と同じく,token
を与えてWebService::Slack::WebApiのオブジェクトを生成し,channel
と,text
が必須です。
リスト9 Slackへの通知のスクリプト例
use WebService::Slack::WebApi;
# (1)WebService::Slack::WebApiのオブジェクト生成
my $slack = WebService::Slack::WebApi->new(
token => 'token',
);
# (1)Slackへの通知の実施
$slack->chat->post_message(
channel => 'channel id',
text => 'hello!',
);
まとめ
今回は,
さて,
バックナンバー
Perl Hackers Hub
- 第65回 依存モジュールの更新 ―update-cpanfile,GitHub Actionsで実現!(2)
- 第65回 依存モジュールの更新 ―update-cpanfile,GitHub Actionsで実現!(1)
- 第64回 少しマニアックなPerlのテクニック―特殊変数,低レベルの標準関数を使いこなす(2)
- 第64回 少しマニアックなPerlのテクニック―特殊変数,低レベルの標準関数を使いこなす(1)
- 第63回 PPIとPerl::Tidyを組み合わせて作るコード整形ツール(2)
- 第63回 PPIとPerl::Tidyを組み合わせて作るコード整形ツール(1)
- 第62回 Perl歴史散策 ―インタプリタの実装と,構文の進化をたどる(3)
- 第62回 Perl歴史散策 ―インタプリタの実装と,構文の進化をたどる(2)
- 第62回 Perl歴史散策 ―インタプリタの実装と,構文の進化をたどる(1)
- 第61回 GitHub ActionsとAmazon ECSを使ったDockerアプリケーションの自動デプロイ(3)