PHPixie Migrateを使用した簡単な移行

画像 数週間前にコンソールエクステンションを開始したことにより、PHPixieとそのコンポーネントの助けを借りて解決されたタスクの範囲を拡大することができました。 そして今、データベース移行ユーティリティであるPHPixie Migrateを紹介します。 他のコンポーネントと同様に、完全に独立して機能します。この記事の最後に、フレームワークなしで実行する方法の例を示します。



既存のプロジェクトのアップグレード
すでにPHPixieを使用している場合、移行を使用するようにアップグレードするのは簡単です。



1.データベース接続設定(database.php)を更新します



PHPixieは、単一の接続文字列の代わりに、たとえば次のような追加のパラメーターが使用される代替構文をサポートするようになりました。



古い代わりに:

return array( 'default' => array( 'connection' => 'mysql:dbname=phpixie', 'user' => 'phpixie', 'password' => 'phpixie', 'driver' => 'pdo' ) );
      
      





現在使用中



 return array( 'default' => array( 'database' => 'phpixie', 'user' => 'phpixie', 'password' => 'phpixie', 'adapter' => 'mysql', // one of: mysql, pgsql, sqlite 'driver' => 'pdo' ) );
      
      





PHPixieは引き続きクエリの古い構成をサポートしますが、Migrateが機能するには、構成が新しい形式であることが重要です。



2. / asset / migrateフォルダーと設定ファイル/assets/config/migrate.phpスケルトンからプロジェクトにコピーします。



以上です。



構成



/assets/config/migrate.php設定を考慮してください



 <?php return array( //   'migrations' => array( 'default' => array( //    database.php 'connection' => 'default', //     ,   /assets/migrate/ 'path' => 'migrations', //  : //       'migrationTable' => '__migrate', //      'lastMigrationField' => 'lastMigration' ) ), //   (  ) 'seeds' => array( 'default' => array( //    database.php 'connection' => 'default', //     ,   /assets/migrate/ 'path' => 'seeds' ) ) );
      
      





ほとんどの場合、2つ以上のベースがある場合、または同じデータベースに異なるシードが必要な場合を除き、この構成で何も変更する必要はありません。



データベースの作成と削除



これで、コンソールから直接データベースを作成および削除できるようになりました。これは、新しいフレームワークによって実行されます:databaseコマンド:



 framework:database ACTION [ CONFIG ] Create or drop a database Arguments: ACTION Either 'create' or 'drop' CONFIG Migration configuration name, defaults to 'default'
      
      





つまり、 コンソールフレームワーク:database createはデータベースが存在するかどうかを確認し、存在しない場合は作成し、 コンソールフレームワーク:データベースドロップは削除します。



移行



さて、今最も重要なことについて。 まず、まだこのようなものを使用していない人のための簡単な紹介。



移行により、データベースの構造の変更をコードに保存することができます。これは、既製のダンプを転送してから本番でデータベースを手動で変更するよりもはるかに便利です。 操作の原理は単純です。最後の移行の名前はデータベースに保存され、コマンドが起動されると、 natsort()順序で「より大きい」すべての移行が適用されます。つまり、ファイル1.sql、2.sql ... 22.sql、および最後のデータベース13.sqlでは、14から22のすべてが実行され、22が後者の名前としてデータベースに保存されます。 .sqlまたは.php形式にすることができます。



SQLの移行



ここではすべてが簡単です。個々の式が「-ステートメント」区切り文字で区切られている単なるSQLファイルです。次に例を示します。



 CREATE TABLE fairies( id int NOT NULL, name VARCHAR(255) ); -- statement CREATE TABLE flowers( id int NOT NULL, name VARCHAR(255) );
      
      





PHP移行



これは、クエリを実行し、PHPixieデータベースクエリにアクセスすることさえできるPHPファイルです。



 $this->execute("CREATE TABLE fairies( id int NOT NULL, name VARCHAR(255) )"); $this->message("-   "); //   $this->connection()->updateQuery() ->table('users') ->set(['role' => 'user']) ->execute();
      
      





ところで、数字だけでなく、移行の名前に短い説明を書くことを強くお勧めします。 natsortの順序が使用されるため、 _記号の後に安全にコメントを書くことができます(33_fairies_table.sqlなど)



ここで、すぐに2つの質問に答える必要があります。



ロールバックへのダウン移行がない理由:



データベース自体の観点から考えると、ロールバックなどはありません。 ロールバックは、前の移行がキャンセルした別の移行です。 さらに、1回の移行でテーブルを削除した場合、ロールバックによってテーブルが再作成される可能性がありますが、データを復元できないため、このようなロールバックは常に可能とは限りません。



createTable()などの汎用メソッドではなく、生のSQLクエリによって変更が行われるのはなぜですか?



普遍的な方法の問題は、異なるデータベース間の違いの微妙さを逃し、多くのことを推測する必要があることです。 さらに、ライブラリが更新され、わずかに異なる方法でフィールドとテーブルを作成し始めると、オプションが可能になり、古い移行を伴う本番ベースは、同じ移行が数ヶ月後に開始された新しいベースとは異なります。 さらに、テーブル用のSQLを作成し、あるデータベースから別のデータベースに変換するためのグラフィカルユーティリティがすでに非常に多くあるため、このためのヘルパーメソッドを作成するのはかなり不必要に思えます。



サイド



サイドは、データベースを満たすことができるデータです。 たとえば、一部のデフォルトユーザー、製品カテゴリなどを使用できます。また、機能テスト用のテストデータをデータベースに入力するために使用することもできます。 ファイル名はテーブル名と一致する必要があり、使用可能な形式は.phpおよび.jsonです。 例:



 // /assets/migrate/seeds/fairies.php <?php return array( array( 'id' => 1, 'name' => 'Pixie' ), array( 'id' => 2, 'name' => 'Trixie' ), );
      
      





 // /assets/migrate/seeds/flowers.json [ { "id": 1, "name": "daisy" }, { "id": 2, "name": "Rose" }, ]
      
      





.phpの場合、データ配列を返すことに加えて、データベース接続を使用してすべてを手動で行うこともできます。



 // /assets/migrate/seeds/fairies.php <?php $this->connection()->insertQuery() ->data([ 'id' => 1, 'name' => 'Pixie' ]) ->execute();
      
      





シードを挿入するには、 framework:seedコマンドを使用します。



 framework:seed [ --truncate ] [ CONFIG ] Seed the database with data Options: truncate Truncate the tables before inserting the data. Arguments: CONFIG Seed configuration name, defaults to 'default'
      
      





データがすでにテーブルに存在する場合、これはエラーにつながります。 挿入する前にテーブルをクリアするには、 -truncateパラメーターを使用できます。



明らかに、同じデータベース接続に対して、構成ファイルで複数のシードプロファイルを指定できます。



フレームワークなしで使用する



他のすべてのPHPixie Migrateコンポーネントと同様に、次のようなフレームワークとは別に使用できます。



 $slice = new \PHPixie\Slice(); $database = new \PHPixie\Database($slice->arrayData(array( 'default' => array( 'database' => 'phpixie', 'user' => 'phpixie', 'password' => 'phpixie', 'adapter' => 'mysql', // one of: mysql, pgsql, sqlite 'driver' => 'pdo' ) ))); $filesystem = new \PHPixie\Filesystem(); $migrate = new \PHPixie\Migrate( $filesystem->root(__DIR__.'/assets/migrate'), $database, $slice->arrayData(array( 'migrations' => array( 'default' => array( 'connection' => 'default', 'path' => 'migrations', ) ), 'seeds' => array( 'default' => array( 'connection' => 'default', 'path' => 'seeds' ) ) ))); $cli = new \PHPixie\CLI(); $console = new \PHPixie\Console($slice, $cli, $migrate->consoleCommands()); $console->runCommand();
      
      





ここで、コマンド名は、 フレームワークプレフィックスなしのrunseedデータベースになります。



もちろん、追加したい機能がいくつかありますが、3番目のPHPixieの移行を既に待っているユーザーにこのコンポーネントがアピールできることを願っています。



All Articles