phpmig から SQLite をマイグレーションする

表題の通り、 phpmig から SQLite をマイグレーションしてみました。

前提

Docker で PHP + SQLite3 の開発環境を構築する の PHP + SQLite 環境を前提にしています。

備考

公式ドキュメントでは 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 されています。大丈夫そうです。

参考

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。