メモ > 技術 > CMS: ECCube > カスタマイズ: マイグレーションでのデータ管理
カスタマイズ: マイグレーションでのデータ管理
EC-CUBE4カスタマイズ - マイグレーションの作成・実行方法
https://umebius.com/eccube/eccube4-howto-migration/
EC-CUBE4でmigrationを使いこなす - Qiita
https://qiita.com/yusukeito58/items/a33e2fd6d26c4fc29d9f
マイグレーションでデータベースを管理できるが、データの編集に使うのが主な目的らしい
ECCube3まではカラムの追加などをマイグレーションで行っていたが、ECCube4では考え方を変えたらしい
以下はマイグレーションを試したときのメモ
テーブルの追加を試しているが、上記のようにテーブルの追加はEntityから行うのが正攻法みたい
Entityでのテーブル作成&列追加は、このファイル内の「ORMでテーブルを作成」を参照
■個別実行
以下のコマンドでマイグレーションを作成できる
バージョン名は、コマンドを実行したときの日時が使われる
$ php bin/console doctrine:migrations:generate
Generated new migration class to "/var/www/html/app/DoctrineMigrations/Version20200728034801.php"
以下のファイルが作成された
作成直後は、マイグレーションの中身はカラ
html\app\DoctrineMigrations\Version20200728034801.php
<?php declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20200728034801 extends AbstractMigration
{
public function up(Schema $schema) : void
{
// this up() migration is auto-generated, please modify it to your needs
}
public function down(Schema $schema) : void
{
// this down() migration is auto-generated, please modify it to your needs
}
}
upとdownの内容を以下のように編集してみる
つまり今回は、table_testテーブルの作成を行う
public function up(Schema $schema) : void
{
$sql =<<<EOL
CREATE TABLE table_test(
id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
text VARCHAR(255) NOT NULL COMMENT 'テキスト',
PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT 'テーブル操作テスト';
EOL;
$this->addSql($sql);
}
public function down(Schema $schema) : void
{
$sql =<<<EOL
DROP TABLE table_test;
EOL;
$this->addSql($sql);
}
以下のコマンドでマイグレーションを実行できる
$ php bin/console doctrine:migrations:execute 20200728034801 --up
WARNING! You are about to execute a database migration that could result in schema changes and data lost. Are you sure you wish to continue? (y/n)y
++ migrating 20200728034801
-> CREATE TABLE table_test(
id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
text VARCHAR(255) NOT NULL COMMENT 'テキスト',
PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT 'テーブル操作テスト';
++ migrated (0.4s)
データベースを確認すると、table_test テーブルが作成されていた
また、既存テーブル migration_versions の version 列に「20200728034801」が登録されていた
これをもとに、どのマイグレーションが実行済みなのかを管理しているみたい
以下のコマンドでマイグレーションの巻き戻しを実行できる
$ php bin/console doctrine:migrations:execute 20200728034801 --down
WARNING! You are about to execute a database migration that could result in schema changes and data lost. Are you sure you wish to continue? (y/n)y
-- reverting 20200728034801
-> DROP TABLE table_test;
-- reverted (0.22s)
データベースを確認すると、table_test テーブルが削除されていた
また、既存テーブル migration_versions の version 列に登録されていた「20200728034801」が削除されていた
■一括実行
以下のコマンドでマイグレーションを一括実行できる
html\app\DoctrineMigrations には元からいくつかマイグレーションが入っているので、それらが実行される
$ php bin/console doctrine:migrations:migrate
Application Migrations
WARNING! You are about to execute a database migration that could result in schema changes and data loss. Are you sure you wish to continue? (y/n)y
Migrating up to 20200303053716 from 0
++ migrating 20181017090225
Migration 20181017090225 was executed but did not result in any SQL statements.
++ migrated (0.27s)
++ migrating 20181109101907
-> UPDATE dtb_page SET page_name = '商品購入/遷移', url = 'shopping_redirect_to' WHERE id = 42
++ migrated (0.02s)
++ migrating 20190821081036
Migration 20190821081036 was executed but did not result in any SQL statements.
++ migrated (0.21s)
++ migrating 20200303053716
-> UPDATE dtb_delivery_duration SET duration = -1 WHERE id = 9 and duration = 0
++ migrated (0.02s)
------------------------
++ finished in 0.52s
++ 4 migrations executed
++ 2 sql queries
もう一度実行すると、実行すべきマイグレーションは無い旨が表示される
$ php bin/console doctrine:migrations:migrate
Application Migrations
No migrations to execute.
Version20200728034801.php を追加してみる
ファイルの内容は何でもいいが、「個別実行」で作成したものを利用してみる
追加したら、マイグレーションを一括実行する
$ php bin/console doctrine:migrations:migrate
Application Migrations
WARNING! You are about to execute a database migration that could result in schema changes and data loss. Are you sure you wish to continue? (y/n)y
Migrating up to 20200728034801 from 20200303053716
++ migrating 20200728034801
-> CREATE TABLE table_test(
id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
text VARCHAR(255) NOT NULL COMMENT 'テキスト',
PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT 'テーブル操作テスト';
++ migrated (0.23s)
------------------------
++ finished in 0.23s
++ 1 migrations executed
++ 1 sql queries
追加したマイグレーションのみが実行された
なお「php bin/console doctrine:migrations:execute --down」を実行すると「Not enough arguments (missing: "version").」というエラーになった
マイグレーションの巻き戻しは、バージョンの指定が必要みたい
よってマイグレーションをやりなおしたければ、
$ php bin/console doctrine:migrations:execute 20200728034801 --down
$ php bin/console doctrine:migrations:migrate
のように必要がある
マイグレーションの実行順に影響はありそうなので注意が必要そう
■確認なしに実行
$ php bin/console doctrine:migrations:migrate
でマイグレーションを実行すると、以下のように実行確認が表示される
「y」を入力して初めて実行されるが、スクリプトで自動化したい場合などは邪魔な処理となる
WARNING! You are about to execute a database migration that could result in schema changes and data loss. Are you sure you wish to continue? (y/n)n
この場合、以下のように「--no-interaction」を付けて実行すると、確認なしにマイグレーションを実行できる
$ php bin/console doctrine:migrations:migrate --no-interaction
【Symfony4】Doctrineマイグレーションコマンドまとめ - Qiita
https://qiita.com/tomcky/items/e30a08861fd2e7530a0d