表題の通り、 phpmig から SQLite をマイグレーションしてみました。
前提
Docker で PHP + SQLite3 の開発環境を構築する の PHP + SQLite 環境を前提にしています。
備考
- GitHub – davedevelopment/phpmig: Simple migrations system for php
- (davedevelopment/phpmig – Packagist)
公式ドキュメントでは Doctrine DBAL 使用なのでそちらの方が良いような気はしますが、簡単にテストしたかったのであえて PDOオブジェクト からでやってみました。
きっかけとしては、前回記事で PDOオブジェクト から接続した際に MySQL とあまり変わらないと感じ、「ひょっとしてできてしまうのでは?」と思ってやってみた次第。
構成
compose.json
// 略
"require-dev": {
// 略
"davedevelopment/phpmig": "v1.7.0"
},
//略
まずは phpmig を用意。なお Pimple, Dotenv 等も併せて入れるものとします。
phpmig.php
<?php
use \Phpmig\Adapter;
use \Pimple\Container;
use \PDO;
use \Dotenv\Dotenv;
// find environment file
$dot_env = __DIR__ . '/.env';
if (is_readable($dot_env)) {
$dotenv = Dotenv::createImmutable(__DIR__ . '/');
$dotenv->load();
}
//$container = new ArrayObject();
$container = new Container();
// replace this with a better Phpmig\Adapter\AdapterInterface
$container['phpmig.adapter'] = new Adapter\File\Flat(__DIR__ . DIRECTORY_SEPARATOR . 'migrations/.migrations.log');
//DBの接続情報
$container['db'] = function(){
$dbh = new PDO('sqlite:/var/sqlite/maindb.sqlite3');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
return $dbh;
};
$container['phpmig.migrations_path'] = __DIR__ . DIRECTORY_SEPARATOR . 'migrations';
return $container;
続いて phpmig.php
。
マイグレーションファイルの生成
# vendor/bin/phpmig status
# vendor/bin/phpmig generate AddPosts
マイグレーションファイルを生成。
# vendor/bin/phpmig status
Status Migration ID Migration Name
-----------------------------------------
down yyyyMMddhhiiss AddPosts
ファイルが生成されました。
migration/yyyyMMddhhiiss_AddPosts.php
<?php
use Phpmig\Migration\Migration;
class AddPosts extends Migration
{
/**
* Do the migration
*/
public function up()
{
$container = $this->getContainer();
$stmt = $container['db']->prepare("create table test(one varchar(10), two smallint);");
$stmt->execute([]);
$stmt = $container['db']->prepare("insert into test values('hello', 10);");
$stmt->execute([]);
$stmt = $container['db']->prepare("insert into test values('hi', 20);");
$stmt->execute([]);
}
/**
* Undo the migration
*/
public function down()
{
}
}
とりあえず UP 側だけ記述してみます。
# vendor/bin/phpmig up yyyyMMddhhiiss
これでマイグレーションを実行。
検証
# sqlite3 /var/sqlite/maindb.sqlite3
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .table
test testtable
sqlite> select * from test;
hello|10
hi|20
sqlite> .exit
データが INSERT されています。大丈夫そうです。