カテゴリー
Linux

Laravel 5.5 既存のデータベースからレコード情報のシーダーファイルを一発で生成した手順

まとめ

バーション情報

  • Laravel Framework 5.5.45
  • Inverse seed generator (iSeed) v2.6.1

Inverse seed generator (iSeed) インストール

composer require orangehill/iseed --dev

実際は次のようになりました。注意点は前回と同じです。

$ docker-compose run --rm composer require orangehill/iseed --dev
Using version ^2.6 for orangehill/iseed
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing orangehill/iseed (v2.6.1): Downloading (100%)
Package phpunit/phpunit-mock-objects is abandoned, you should avoid using it. No replacement was suggested.
Writing lock file
Generating optimized autoload files
*******************************************
 /!\ Warning, you're using a deprecated
 ¨¨¨ version of Carbon, we will soon stop
     providing support and update for 1.x
     versions, please upgrade to Carbon 2.
*******************************************

Most features of Carbon 1 are still available in Carbon 2.
See how to migrate: https://carbon.nesbot.com/docs/#api-carbon-2

Please consider upgrading your Laravel dependencies to be compatible with Carbon 2:
  - laravel/framework at least to version 5.8.0

If you can't update Laravel, check https://carbon.nesbot.com/ to see how to
install Carbon 2 using alias version and our adapter kylekatarnls/laravel-carbon-2

You can run './vendor/bin/upgrade-carbon' to get help in updating carbon and other frameworks and libraries that depend on it.
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: orangehill/iseed
Package manifest generated successfully.

Inverse seed generator (iSeed) の help

# php artisan help iseed
Usage:
  iseed [options] [--] <tables>

Arguments:
  tables                                   comma separated string of table names

Options:
      --clean                              clean iseed section
      --force                              force overwrite of all existing seed classes
      --database[=DATABASE]                database connection [default: "mysql"]
      --max[=MAX]                          max number of rows
      --chunksize[=CHUNKSIZE]              size of data chunks for each insert query
      --exclude[=EXCLUDE]                  exclude columns
      --prerun[=PRERUN]                    prerun event name
      --postrun[=POSTRUN]                  postrun event name
      --dumpauto[=DUMPAUTO]                run composer dump-autoload [default: true]
      --noindex                            no indexing in the seed
      --orderby[=ORDERBY]                  orderby desc by column
      --direction[=DIRECTION]              orderby direction
      --classnameprefix[=CLASSNAMEPREFIX]  prefix for class and file name
      --classnamesuffix[=CLASSNAMESUFFIX]  suffix for class and file name
  -h, --help                               Display this help message
  -q, --quiet                              Do not output any message
  -V, --version                            Display this application version
      --ansi                               Force ANSI output
      --no-ansi                            Disable ANSI output
  -n, --no-interaction                     Do not ask any interactive question
      --env[=ENV]                          The environment the command should run under
  -v|vv|vvv, --verbose                     Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Help:
  Generate seed file from table
#

Inverse seed generator (iSeed) を実際に動かす

必ずテーブル名を指定しなければならないのが少し面倒ですけれども、使い方自体は簡単でした。

# php artisan iseed wp_commentmeta,wp_comments,wp_links,wp_options,wp_postmeta,wp_posts,wp_term_relationships,wp_term_taxonomy,wp_termmeta,wp_terms,wp_usermeta,wp_users
Created a seed file from table wp_commentmeta
Created a seed file from table wp_comments
Created a seed file from table wp_links
Created a seed file from table wp_options
Created a seed file from table wp_postmeta
Created a seed file from table wp_posts
Created a seed file from table wp_term_relationships
Created a seed file from table wp_term_taxonomy
Created a seed file from table wp_termmeta
Created a seed file from table wp_terms
Created a seed file from table wp_usermeta
Created a seed file from table wp_users
#

結果、 database/seeds/ に上記のファイルが追加され、さらに、 database/seeds/DatabaseSeeder.php に上記ファイルを実行するように追記されていました。

生成されたシーダーファイルの中身

例えば database/seeds/WpCommentsTableSeeder.php は次のようになりました。

  • まずレコードを全て削除してからデータを追加する流れ。
  • ファイルの各行の行末に不要なスペースが高い頻度で混じっている。
<?php

use Illuminate\Database\Seeder;

class WpCommentsTableSeeder extends Seeder
{

    /**
     * Auto generated seed file
     *
     * @return void
     */
    public function run()
    {
        

        \DB::table('wp_comments')->delete();
        
        \DB::table('wp_comments')->insert(array (
            0 => 
            array (
                'comment_ID' => 1,
                'comment_post_ID' => 1,
                'comment_author' => 'WordPress コメントの投稿者',
                'comment_author_email' => 'wapuu@wordpress.example',
                'comment_author_url' => 'https://wordpress.org/',
                'comment_author_IP' => '',
                'comment_date' => '2019-06-02 10:24:29',
                'comment_date_gmt' => '2019-06-02 01:24:29',
                'comment_content' => 'こんにちは、これはコメントです。
コメントの承認、編集、削除を始めるにはダッシュボードの「コメント画面」にアクセスしてください。
コメントのアバターは「<a href="https://gravatar.com">Gravatar</a>」から取得されます。',
                'comment_karma' => 0,
                'comment_approved' => '1',
                'comment_agent' => '',
                'comment_type' => '',
                'comment_parent' => 0,
                'user_id' => 0,
            ),
        ));
        
        
    }

おわりに

Laravel 5.5 既存のデータベースからマイグレーションファイルを一発で生成した手順 – oki2a24 で疑問視したように、マイグレーションファイルで既存のデータベースの情報をマイグレーションファイルとして生成したとしても、データベースレコードも使いたい場合は意味がありません。レコードも抽出できれば良いのに、という問題がありました。

今回の投稿はそれを解決するものとなります。

ただ、シーダークラスファイルは、どちらかというとテスト用のデータを気軽に作るための用途が一般的なように感じます。

既存のデータベースのレコード数が非常に大きな場合、シーダークラスファイルに抽出して、というのはシーダークラスファイルの大きさが非常に大きくなり、また、DB へ入れる際にも非常に時間がかかると予想されるため、良い方法とは言えないと思います。

そうなると使いどころですけれども、アプリをリリースする準備段階として、余計なデータベースデータを削除して、残した設定系のマスタデータをシーダークラスファイルとして逆生成する、というのは、良い使い道ではないでしょうか。

既存のデータベースを使ったままのシステムリプレース業務の場合は、マイグレーションクラスやシーダークラスのファイルをデータベースから逆生成する意味は薄いように感じました。

最後に、参考ページです。このページのおかげで、 Inverse seed generator (iSeed) を見つけることができました。

以上です。

コメントを残す