2012/05/24

MySQLのテーブル定義をGitでバージョン管理する その2

前回のつづき。

え?そもそもそんな需要はない? 知ってますよ、はい。




経緯とか前置きとかは前回の記事を見てもらうとして、
今回の主題は手順2の文字列加工の部分。
VBSが文字列一括置換ができなかったり、UTF-8がデフォルトで使えなかったり、
といろいろ曲折してすげー長い行数のスクリプトを書いたわけです。
で、これをPowerShellで書き直してみたらなんと3行で済んじゃいましたっていうお話。


手順1

mysqldumpはそのままで変更ありません。

手順2

前回、「AUTO_INCREMENT=nnnn」 を 「AUTO_INCREMENT=?」に置換してたんですが、
このままでは実行できないので、今回は「AUTO_INCREMENT=nnnn」を丸ごと削除してしまうことにします。



PowerShell

何かの縁がなくてしらなかった方のために大雑把過ぎる説明すると、PowerShellってのはWSH(VBScript)のさらに強いやつです。
構文がより一般的なスクリプト言語に近づいていて、いろいろできるようになりました。
Windows7から標準で搭載され、XPにも追加インストールが可能です。
って最近になってやっと手を出し始めたところなのでまだろくに使いこなせてません。

これの標準出力がコマンドプロンプトとちがって「Unicode」なのがポイントです。
で、Windows上で「Unicode」って書いてある場合は特に指定がない限りはどうやら「UTF-16」らしいのです。
(細かく書くと「UTF-16LE」)
そう、また文字コードが違うんです。
ですが、さすがVBScriptより強いやつなのでエンコードの変換がいとも簡単にできます。

無駄に長く説明しましたがコードは以下のとおりです。

$filepath = "D:\log\mysql\schema.git\schema.sql"
$dump = Get-Content $filepath -Encoding UTF8
$dump -replace "(AUTO_INCREMENT=[0-9]* |-- Dump completed on .*)","" | Set-Content $filepath -Encoding UTF8

ソースを簡単に説明すると、
Get-Content で指定したファイルパスのファイルの中身を -Encoding で指定した文字コードで読み取り、変数$dumpにいれます。
で、それを -replace で正規表現で置換し、パイプして Set-Content で指定したファイルパスに -Encodingで指定した文字コードに変換して書き出します。
PowerShellでもコマンドプロンプト同様「>>」によるリダイレクト書き出しができるのですが、それをするとUTF-16になってしまうので、Set-Content -Encodingを使うのがコツです。

このテキストを「replaceDumpedSql.ps1」のファイル名で保存します。


手順3

バッチファイルは前回VBScriptを呼び出していた箇所だけ変更します。
: 定義をdumpする
mysqldump --user=name --password=pass --all-databases --no-data > D:\log\mysql\schema.git\schema.sql

: AUTO_INCREMENT値等を消す
powershell -ExecutionPolicy RemoteSigned -Nologo .\replaceDumpedSql.ps1

: 日付から/を取り除いた文字列を作る
SET dt=%DATE:/=%

: リポジトリに移動する
CD /D D:\log\mysql\schema.git

: Gitコマンド
git add .
git commit -m "backup-%dt%"


手順4

タスクスケジューラは変更ありません。



おまけ

今回のソースはPowerShell 1.0以上で動きます。

0 件のコメント:

コメントを投稿