facebook twitter hatena line email

「Php/phpmig」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(マイグレーション実行)
(Migration IDが、UP成功と、MISSINGで、2つある場合)
 
(同じ利用者による、間の46版が非表示)
行6: 行6:
  
 
参考:https://qiita.com/hideiwa1/items/98f74d95806f8d43cef9
 
参考:https://qiita.com/hideiwa1/items/98f74d95806f8d43cef9
 +
 +
参考:https://labor.ewigleere.net/2020/01/24/phpmig-phpmyadmin-migrate/
 
===composer.jsonから作成の場合===
 
===composer.jsonから作成の場合===
 
composer.json
 
composer.json
行17: 行19:
 
</pre>
 
</pre>
 
$ composer update
 
$ composer update
 +
 
==phpmig初期設定==
 
==phpmig初期設定==
 
<pre>
 
<pre>
vendor/bin/phpmig init
+
% vendor/bin/phpmig init
 +
+d ./migrations Place your migration files in here
 +
+f ./phpmig.php Create services in here
 
</pre>
 
</pre>
 +
 +
migrationsディレクトリと、phpmig.phpファイルができる。
 +
 +
phpmig.php
 +
<pre>
 +
<?php
 +
 +
use \Phpmig\Adapter;
 +
 +
$container = new ArrayObject();
 +
 +
// replace this with a better Phpmig\Adapter\AdapterInterface
 +
$container['phpmig.adapter'] = new Adapter\File\Flat(__DIR__ . DIRECTORY_SEPARATOR . 'migrations/.migrations.log');
 +
 +
$container['phpmig.migrations_path'] = __DIR__ . DIRECTORY_SEPARATOR . 'migrations';
 +
 +
// You can also provide an array of migration files
 +
// $container['phpmig.migrations'] = array_merge(
 +
//    glob('migrations_1/*.php'),
 +
//    glob('migrations_2/*.php')
 +
// );
 +
 +
return $container;
 +
</pre>
 +
 +
中身を以下参考ページを見ながら、接続できるように修正。
 +
 +
参考:https://qiita.com/hideiwa1/items/98f74d95806f8d43cef9
  
 
==db設定==
 
==db設定==
 
config/database/の下にファイルを作成
 
config/database/の下にファイルを作成
 +
 +
==中身の書き方==
 +
公式:https://github.com/davedevelopment/phpmig
  
 
==マイグレーション実行==
 
==マイグレーション実行==
  % vendor/bin/phpmig generate AddTests
+
  % vendor/bin/phpmig generate AddTest
  +f ./migrations/20241021162822_AddTests.php
+
  +f ./migrations/20241022021157_AddTest.php
  
以下ファイルだけが、作成される
+
以下ファイルだけが、作成される(これ以外の更新はない)
  
migrations/20241021162822_AddTests.php
+
migrations/20241022021157_AddTest.php
 
<pre>
 
<pre>
 
use Phpmig\Migration\Migration;
 
use Phpmig\Migration\Migration;
行54: 行90:
 
}
 
}
 
</pre>
 
</pre>
 +
 +
以下のように修正
 +
<pre>
 +
class AddTest extends Migration
 +
{
 +
    /**
 +
    * Do the migration
 +
    */
 +
    public function up()
 +
    {
 +
        $sql =<<<EOF
 +
CREATE TABLE tests(
 +
    `id` integer(15) NOT NULL AUTO_INCREMENT,
 +
    `name` varchar(255) NOT NULL,
 +
    `is_delete` boolean NOT NULL DEFAULT false,
 +
    `created_at` datetime DEFAULT CURRENT_TIMESTAMP(),
 +
    `updated_at` datetime DEFAULT CURRENT_TIMESTAMP(),
 +
    PRIMARY KEY (`id`)
 +
    );
 +
EOF;
 +
        $container = $this -> getContainer();
 +
        $container['db']->query($sql);
 +
    }
 +
 +
    /**
 +
    * Undo the migration
 +
    */
 +
    public function down()
 +
    {
 +
        $sql =<<<EOF
 +
DROP TABLE IF EXISTS tests
 +
EOF;
 +
        $container = $this->getContainer();
 +
        $container['db']->query($sql);
 +
 +
    }
 +
}
 +
</pre>
 +
 +
==マイグレーション実行方法==
 +
<pre>
 +
$ vendor/bin/phpmig migrate
 +
m == 20241022021157 AddTest migrating
 +
== 20241022021157 AddTest migrated 0.0282s
 +
</pre>
 +
migration内のファイルが全て実行され、
 +
testsテーブルが作成される。
 +
 +
==マイグレーション順序==
 +
ファイルのところにある数字順になる。なので、数字の桁が間違ってると順番が変わる。
 +
 +
==ステータス確認==
 +
どこまで反映されてるか確認できる。
 +
<pre>
 +
$ vendor/bin/phpmig status
 +
 +
Status  Migration ID    Migration Name
 +
-----------------------------------------
 +
    up  20241022021157  AddTest
 +
  down  20241022023036  AddTest2
 +
</pre>
 +
upが反映されていて、downが反映されてない。
 +
 +
==マイグレーションid指定する場合==
 +
<pre>
 +
vendor/bin/phpmig migrate -t 20241022023036
 +
</pre>
 +
20241022023036のマイグレーションidが、最終反映された状態まで構築される
 +
 +
<pre>
 +
% vendor/bin/phpmig status
 +
Status  Migration ID    Migration Name
 +
-----------------------------------------
 +
    up  20241022021157  AddTest
 +
    up  20241022023036  AddTest2
 +
  down  20241022024629  AddTest3
 +
</pre>
 +
 +
==マイグレーションのロールバック==
 +
<pre>
 +
% vendor/bin/phpmig rollback
 +
m == 20241022021157 AddTest reverting
 +
== 20241022021157 AddTest reverted 0.0049s
 +
</pre>
 +
一つ前のマイグレーションidの
 +
testsテーブルが削除される。
 +
 +
===マイグレーションidを指定してロールバックする場合===
 +
<pre>
 +
vendor/bin/phpmig rollback -t 20241022021157
 +
</pre>
 +
20241022021157のマイグレーションidが、最終反映された状態にもどる
 +
 +
<pre>
 +
% vendor/bin/phpmig status
 +
m
 +
Status  Migration ID    Migration Name
 +
-----------------------------------------
 +
    up  20241022021157  AddTest
 +
    up  20241022023036  AddTest2
 +
  down  20241022024629  AddTest3
 +
</pre>
 +
 +
==特定のマイグレーションidだけ、downする場合==
 +
あまり使わないだろうが、特定のマイグレーションidだけ、downする場合。
 +
 +
全てをmigrateさせた後実行した結果↓
 +
<pre>
 +
$ vendor/bin/phpmig down 20241022023036
 +
$ vendor/bin/phpmig status
 +
m
 +
Status  Migration ID    Migration Name
 +
-----------------------------------------
 +
    up  20241022021157  AddTest
 +
  down  20241022023036  AddTest2
 +
    up  20241022024629  AddTest3
 +
</pre>
 +
 +
==特定のマイグレーションidだけ、upする場合==
 +
あまり使わないだろうが、特定のマイグレーションidだけ、upする場合。
 +
 +
全てをrollbackさせた後実行した結果↓
 +
<pre>
 +
$ vendor/bin/phpmig up 20241022023036
 +
$ vendor/bin/phpmig status
 +
Status  Migration ID    Migration Name
 +
-----------------------------------------
 +
  down  20241022021157  AddTest
 +
    up  20241022023036  AddTest2
 +
  down  20241022024629  AddTest3
 +
</pre>
 +
 +
==downの時テーブルが無いときにエラーが出ないように==
 +
エラー詳細
 +
<pre>
 +
SQLSTATE[42S02]: Base table or view not found: 1051 Unknown table 'phpmig.tests'
 +
</pre>
 +
 +
down()のところのsqlにの"IF EXISTS "を追加するとよいです。
 +
<pre>
 +
-DROP TABLE tests;
 +
+DROP TABLE IF EXISTS tests;
 +
</pre>
 +
 +
==反映済みのログのようなもの==
 +
schemaにmigrationsというtableがあり、反映してるversionが入ってる。downしたら、versionレコードは消える。
 +
<pre>
 +
select * from migrations;
 +
+----------------+
 +
| version        |
 +
+----------------+
 +
| 20241022021157 |
 +
| 20241022023036 |
 +
| 20241022024629 |
 +
</pre>
 +
なければ、migrations_info とかにテーブル名が変更されてるかも
 +
 +
==statusで"MISSING"なエラーが出る場合==
 +
エラー詳細
 +
up  20241022021157  ** MISSING **
 +
反映(する/した)ファイルが見つからない。
 +
 +
対応方法:migrationsテーブルから特定のレコードを削除すれば良い
 +
delete from migrations where version ='20241022021157';
 +
 +
===Migration IDが、UP成功と、MISSINGで、2つある場合===
 +
migrationsに同じIDが2つあると思われるので、あとの方とかを消せば良いかも?
 +
 +
消し方:このテーブルはカラムが、1カラムだけなので、一旦selectしてバックアップして、insertするのが良いかも。
 +
 +
==rollback時に"Target version not found"が発生する場合==
 +
エラー詳細
 +
Target version (20241022021157) not found
 +
 +
migrationsテーブルから特定のレコードを削除すれば良い
 +
delete from migrations where version ='20241022021157';

2024年11月13日 (水) 23:55時点における最新版

phpmigインストール(composer)

composer require davedevelopment/phpmig
composer require pimple/pimple

参考:https://qiita.com/hideiwa1/items/98f74d95806f8d43cef9

参考:https://labor.ewigleere.net/2020/01/24/phpmig-phpmyadmin-migrate/

composer.jsonから作成の場合

composer.json

{
    "require": {
        "davedevelopment/phpmig": "^1.7",
        "pimple/pimple": "^3.5"
    }
}

$ composer update

phpmig初期設定

% vendor/bin/phpmig init
+d ./migrations Place your migration files in here
+f ./phpmig.php Create services in here

migrationsディレクトリと、phpmig.phpファイルができる。

phpmig.php

<?php

use \Phpmig\Adapter;

$container = new ArrayObject();

// replace this with a better Phpmig\Adapter\AdapterInterface
$container['phpmig.adapter'] = new Adapter\File\Flat(__DIR__ . DIRECTORY_SEPARATOR . 'migrations/.migrations.log');

$container['phpmig.migrations_path'] = __DIR__ . DIRECTORY_SEPARATOR . 'migrations';

// You can also provide an array of migration files
// $container['phpmig.migrations'] = array_merge(
//     glob('migrations_1/*.php'),
//     glob('migrations_2/*.php')
// );

return $container;

中身を以下参考ページを見ながら、接続できるように修正。

参考:https://qiita.com/hideiwa1/items/98f74d95806f8d43cef9

db設定

config/database/の下にファイルを作成

中身の書き方

公式:https://github.com/davedevelopment/phpmig

マイグレーション実行

% vendor/bin/phpmig generate AddTest
+f ./migrations/20241022021157_AddTest.php

以下ファイルだけが、作成される(これ以外の更新はない)

migrations/20241022021157_AddTest.php

use Phpmig\Migration\Migration;

class AddTests extends Migration
{
    /**
     * Do the migration
     */
    public function up()
    {

    }

    /**
     * Undo the migration
     */
    public function down()
    {

    }
}

以下のように修正

class AddTest extends Migration
{
    /**
     * Do the migration
     */
    public function up()
    {
        $sql =<<<EOF
CREATE TABLE tests(
    `id` integer(15) NOT NULL AUTO_INCREMENT,
    `name` varchar(255) NOT NULL,
    `is_delete` boolean NOT NULL DEFAULT false,
    `created_at` datetime DEFAULT CURRENT_TIMESTAMP(),
    `updated_at` datetime DEFAULT CURRENT_TIMESTAMP(),
    PRIMARY KEY (`id`)
    );
EOF;
        $container = $this -> getContainer();
        $container['db']->query($sql);
    }

    /**
     * Undo the migration
     */
    public function down()
    {
        $sql =<<<EOF
DROP TABLE IF EXISTS tests
EOF;
        $container = $this->getContainer();
        $container['db']->query($sql);

    }
}

マイグレーション実行方法

$ vendor/bin/phpmig migrate
m == 20241022021157 AddTest migrating
 == 20241022021157 AddTest migrated 0.0282s

migration内のファイルが全て実行され、 testsテーブルが作成される。

マイグレーション順序

ファイルのところにある数字順になる。なので、数字の桁が間違ってると順番が変わる。

ステータス確認

どこまで反映されてるか確認できる。

$ vendor/bin/phpmig status

 Status   Migration ID    Migration Name
-----------------------------------------
     up  20241022021157  AddTest
   down  20241022023036  AddTest2

upが反映されていて、downが反映されてない。

マイグレーションid指定する場合

vendor/bin/phpmig migrate -t 20241022023036

20241022023036のマイグレーションidが、最終反映された状態まで構築される

% vendor/bin/phpmig status
 Status   Migration ID    Migration Name
-----------------------------------------
     up  20241022021157  AddTest
     up  20241022023036  AddTest2
   down  20241022024629  AddTest3

マイグレーションのロールバック

% vendor/bin/phpmig rollback
m == 20241022021157 AddTest reverting
 == 20241022021157 AddTest reverted 0.0049s

一つ前のマイグレーションidの testsテーブルが削除される。

マイグレーションidを指定してロールバックする場合

vendor/bin/phpmig rollback -t 20241022021157

20241022021157のマイグレーションidが、最終反映された状態にもどる

% vendor/bin/phpmig status
m
 Status   Migration ID    Migration Name
-----------------------------------------
     up  20241022021157  AddTest
     up  20241022023036  AddTest2
   down  20241022024629  AddTest3

特定のマイグレーションidだけ、downする場合

あまり使わないだろうが、特定のマイグレーションidだけ、downする場合。

全てをmigrateさせた後実行した結果↓

$ vendor/bin/phpmig down 20241022023036
$ vendor/bin/phpmig status
m
 Status   Migration ID    Migration Name
-----------------------------------------
     up  20241022021157  AddTest
   down  20241022023036  AddTest2
     up  20241022024629  AddTest3

特定のマイグレーションidだけ、upする場合

あまり使わないだろうが、特定のマイグレーションidだけ、upする場合。

全てをrollbackさせた後実行した結果↓

$ vendor/bin/phpmig up 20241022023036
$ vendor/bin/phpmig status
 Status   Migration ID    Migration Name
-----------------------------------------
   down  20241022021157  AddTest
     up  20241022023036  AddTest2
   down  20241022024629  AddTest3

downの時テーブルが無いときにエラーが出ないように

エラー詳細

 SQLSTATE[42S02]: Base table or view not found: 1051 Unknown table 'phpmig.tests'

down()のところのsqlにの"IF EXISTS "を追加するとよいです。

-DROP TABLE tests;
+DROP TABLE IF EXISTS tests;

反映済みのログのようなもの

schemaにmigrationsというtableがあり、反映してるversionが入ってる。downしたら、versionレコードは消える。

 select * from migrations;
+----------------+
| version        |
+----------------+
| 20241022021157 |
| 20241022023036 |
| 20241022024629 |

なければ、migrations_info とかにテーブル名が変更されてるかも

statusで"MISSING"なエラーが出る場合

エラー詳細

up  20241022021157  ** MISSING **

反映(する/した)ファイルが見つからない。

対応方法:migrationsテーブルから特定のレコードを削除すれば良い

delete from migrations where version ='20241022021157';

Migration IDが、UP成功と、MISSINGで、2つある場合

migrationsに同じIDが2つあると思われるので、あとの方とかを消せば良いかも?

消し方:このテーブルはカラムが、1カラムだけなので、一旦selectしてバックアップして、insertするのが良いかも。

rollback時に"Target version not found"が発生する場合

エラー詳細

Target version (20241022021157) not found

migrationsテーブルから特定のレコードを削除すれば良い

delete from migrations where version ='20241022021157';