Memo

メモ > 技術 > 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/main/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

Advertisement