Files
2024-03-17 11:39:27 +07:00

215 lines
6.8 KiB
ReStructuredText

.. index::
single: Database Seeding
データベースの初期データ投入
============================
バージョン0.5.0 では、Phinx はデータベースにテストデータをシードするためのサポートを導入しました。
シードクラスは、作成済みのデータをデータベースに簡単に投入するための優れた方法です。
デフォルトでは ``seeds`` ディレクトリーに保存されます。 ただし、このパスは設定ファイルで変更できます。
.. note::
データベースのシードは完全にオプションで、
Phinx はデフォルトで ``seeds`` ディレクトリーを作成しません。
シードクラスの新規作成
----------------------
Phinx には、新しいシードクラスを簡単に生成するコマンドが含まれています。
.. code-block:: bash
$ php vendor/bin/phinx seed:create UserSeeder
複数のシードのパスを指定した場合は、新しいシードクラスを作成するパスを選択するように求められます。
以下は、スケルトンテンプレートを元にしています。 ::
<?php
use Phinx\Seed\AbstractSeed;
class MyNewSeeder extends AbstractSeed
{
/**
* Run Method.
*
* Write your database seeder using this method.
*
* More information on writing seeders is available here:
* http://docs.phinx.org/en/latest/seeding.html
*/
public function run()
{
}
}
AbstractSeed クラス
-------------------
すべての Phinx のシードは ``AbstractSeed`` クラスを継承します。
このクラスは、シードクラスを作成するために必要なサポートを提供します。
シードクラスは主にテストデータの挿入に使用されます。
run メソッド
~~~~~~~~~~~~
run メソッドは、 `seed:run` コマンドを実行すると、Phinx によって自動的に呼び出されます。
このメソッドを使用してテストデータを挿入してください。
.. note::
マイグレーションとは異なり、Phinx はどのシードクラスが実行されたかを把握していません。
これは、データベースシーダーを繰り返し実行できることを意味します。
開発時にはこのことに留意してください。
データの挿入
------------
Table オブジェクトの使用
~~~~~~~~~~~~~~~~~~~~~~~~
シードクラスは、使い慣れた ``Table`` オブジェクトを使ってデータを挿入することもできます。
シードクラス内から ``table()`` メソッドを呼び出し、 ``insert()`` メソッドを使用して
データを挿入することで、Table オブジェクトのインスタンスを取得できます。 ::
<?php
use Phinx\Seed\AbstractSeed;
class PostsSeeder extends AbstractSeed
{
public function run()
{
$data = [
[
'body' => 'foo',
'created' => date('Y-m-d H:i:s'),
],
[
'body' => 'bar',
'created' => date('Y-m-d H:i:s'),
]
];
$posts = $this->table('posts');
$posts->insert($data)
->save();
}
}
.. note::
``save()`` メソッドを呼び出して、データをテーブルにコミットする必要があります。
Phinx はデータをバッファリングします。
Faker ライブラリーとの統合
~~~~~~~~~~~~~~~~~~~~~~~~~~
シードクラスですばらしい `Faker ライブラリー <https://github.com/fzaninotto/Faker>`_
を使うのは簡単です。Composer を使用してインストールするだけです。
.. code-block:: bash
$ composer require fzaninotto/faker
そして、シードクラスの中で、それを使用してください。 ::
<?php
use Phinx\Seed\AbstractSeed;
class UserSeeder extends AbstractSeed
{
public function run()
{
$faker = Faker\Factory::create();
$data = [];
for ($i = 0; $i < 100; $i++) {
$data[] = [
'username' => $faker->userName,
'password' => sha1($faker->password),
'password_salt' => sha1('foo'),
'email' => $faker->email,
'first_name' => $faker->firstName,
'last_name' => $faker->lastName,
'created' => date('Y-m-d H:i:s'),
];
}
$this->insert('users', $data);
}
}
テーブルのデータ消去
--------------------
データを挿入することに加えて、Phinx は SQL の ``TRUNCATE`` コマンドを使って
テーブルを空にすることを容易にします。 ::
<?php
use Phinx\Seed\AbstractSeed;
class UserSeeder extends AbstractSeed
{
public function run()
{
$data = [
[
'body' => 'foo',
'created' => date('Y-m-d H:i:s'),
],
[
'body' => 'bar',
'created' => date('Y-m-d H:i:s'),
]
];
$posts = $this->table('posts');
$posts->insert($data)
->save();
// テーブルを空にします
$posts->truncate();
}
}
.. note::
SQLite は ``TRUNCATE`` コマンドをネイティブにサポートしていないので、 ``DELETE FROM``
が使用されています。テーブルのデータ消去後、 ``VACUUM`` コマンドを呼び出すことをお勧めします。
Phinx はこれを自動的には行いません。
シードクラスの実行
------------------
これは簡単な部分です。データベースをシードするには、 ``seed:run`` コマンドを使います。
.. code-block:: bash
$ php vendor/bin/phinx seed:run
デフォルトでは、Phinx は利用可能なすべてのシードクラスを実行します。
特定のクラスを実行したい場合は、 ``-s`` パラメーターを使ってそのクラスの名前を渡します。
.. code-block:: bash
$ php vendor/bin/phinx seed:run -s UserSeeder
複数のシーダーを実行することもできます。
.. code-block:: bash
$ php vendor/bin/phinx seed:run -s UserSeeder -s PermissionSeeder -s LogSeeder
``-v`` パラメーターを使用して、より詳細な出力を表示することもできます。
.. code-block:: bash
$ php vendor/bin/phinx seed:run -v
Phinx のシード機能は、テストデータをデータベースに簡単かつ繰り返し挿入するための
簡単なメカニズムを提供します。