「Php/phpmig」の版間の差分
| (同じ利用者による、間の27版が非表示) | |||
| 120行目: | 120行目: | ||
{ | { | ||
$sql =<<<EOF | $sql =<<<EOF | ||
DROP TABLE tests | DROP TABLE IF EXISTS tests | ||
EOF; | EOF; | ||
$container = $this->getContainer(); | $container = $this->getContainer(); | ||
| 137行目: | 137行目: | ||
migration内のファイルが全て実行され、 | migration内のファイルが全て実行され、 | ||
testsテーブルが作成される。 | 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> | |||
==マイグレーションのロールバック== | ==マイグレーションのロールバック== | ||
| 151行目: | 181行目: | ||
vendor/bin/phpmig rollback -t 20241022021157 | vendor/bin/phpmig rollback -t 20241022021157 | ||
</pre> | </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> | <pre> | ||
$ vendor/bin/phpmig down 20241022023036 | |||
$ vendor/bin/phpmig status | $ 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 | Status Migration ID Migration Name | ||
----------------------------------------- | ----------------------------------------- | ||
down 20241022021157 AddTest | 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'; | |||
==マイグレーションテンプレート設定== | |||
phpmig.php | |||
<pre> | |||
// カスタムテンプレート | |||
$container['phpmig.migrations_template_path'] = __DIR__ . '/migration.php'; | |||
</pre> | |||
migration.php | |||
<pre> | |||
<?= "<?php ". PHP_EOL; ?> | |||
use Phpmig\Migration\Migration; | |||
class <?= $className ?> extends Migration | |||
{ | |||
/** | |||
* Do the migration | |||
*/ | |||
public function up() | |||
{ | |||
} | |||
/** | |||
* Undo the migration | |||
*/ | |||
public function down() | |||
{ | |||
} | |||
} | |||
</pre> | </pre> | ||
カスタムマイグレーションコマンド | |||
$ vendor/bin/phpmig generate examples23 | |||
> m+f ./migrations/20250514120218_examples23.php | |||
参考:https://qiita.com/imunew/items/98fcf8b807cf41c0bad8 | |||
2025年5月14日 (水) 03:03時点における最新版
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';
マイグレーションテンプレート設定
phpmig.php
// カスタムテンプレート $container['phpmig.migrations_template_path'] = __DIR__ . '/migration.php';
migration.php
<?= "<?php ". PHP_EOL; ?>
use Phpmig\Migration\Migration;
class <?= $className ?> extends Migration
{
/**
* Do the migration
*/
public function up()
{
}
/**
* Undo the migration
*/
public function down()
{
}
}
カスタムマイグレーションコマンド
$ vendor/bin/phpmig generate examples23 > m+f ./migrations/20250514120218_examples23.php