11

本番環境で DB シード スクリプトを実行すると、メモリが枯渇します。

以下は私のシードスクリプトです。

class MembershipTableSeeder extends Seeder 
{
    public function run()
    {
        DB::table('members')->delete();

        foreach (range(1, 99) as $days){
            Members::create(array('membership_code' => 'test'.$days));
        }

        DB::unprepared(file_get_contents(app_path()."/database/seeds/members.sql"));
    }
}

そこで私がしたことは、シード スクリプトに無制限を追加することでした。

ini_set('memory_limit', '-1');

問題は、スクリプトを実行すると、出力がターミナルにログされ、SQL スクリプトの内容が記録されることです (これは非常に大きなものです)。

多くのメモリを消費しない DB シード内で SQL ダンプを実行する良い方法はありますか? 私が今やったことは、手動で実行することでした:

mysql -uuser -p db < script.sql
4

4 に答える 4

15

より Laravel っぽいソリューションを好む他の人のために、これは私がそれをどのように処理したかです。

/**
 * This class is responsible for running the data dump sql.
 * It is recommended to update this class instead of creating new ones for new database content dumps.
 */
class DatabaseDumpSeeder extends Seeder
{
    /**
     * Run the database seeds.
     * @throws \Exception
     */
    public function run()
    {
        // Note: these dump files must be generated with DELETE (or TRUNCATE) + INSERT statements
        $sql = file_get_contents(__DIR__ . '/dumps/dump-20150709.sql');

        if (! str_contains($sql, ['DELETE', 'TRUNCATE'])) {
            throw new Exception('Invalid sql file. This will not empty the tables first.');
        }

        // split the statements, so DB::statement can execute them.
        $statements = array_filter(array_map('trim', explode(';', $sql)));

        foreach ($statements as $stmt) {
            DB::statement($stmt);
        }
    }
}
于 2015-07-09T13:54:17.473 に答える
12

問題が発生するのは、Db::unprepared を使用すると、クエリが laravel.log ファイルにも記録され、バックグラウンドで思ったよりも多くのアクションが行われ、こちら側からメモリが枯渇するためです。セーフ モードを実行していない場合は、次のようなコンソール コマンドを実行します。

exec("mysql -u ".\Config::get('database.mysql.user')." -p".\Config::get('database.mysql.password')." ".\Config::get('database.mysql.database')." < script.sql")
于 2014-09-18T07:55:51.650 に答える
2

Project_directory/database/seeds に Seeder ファイル "PostalCodeTableSeeder.php" を作成します。

Illuminate\Database\Seeder を使用します。

class PostalCodeTableSeeder は Seeder を拡張します {
    /**
     * データベースのシードを実行します。
     *
     * @return void
     */
    パブリック関数 run()
    {
        // =============================================== =============
        // ファイルパス -> Project/app/configs/database.php
        // データベース名、データベース ユーザー名、データベース パスワードを取得します
        // =============================================== =============
        $db = \Config::get('database.connections.mysql.database');
        $user = \Config::get('database.connections.mysql.username');
        $pass = \Config::get('database.connections.mysql.password');

        // $this->command->info($db);
        // $this->command->info($user);
        // $this->command->info($pass);

        // PHPコードでコマンドラインインポートを実行
        exec("mysql -u " . $user . " -p" . $pass . " " . $db . " < postal_codes.sql");
        // post_codes.sql はルート フォルダー内にあります
    }
}

また、以下のコードのように、クラス名を Project_directory/database/seed/DatabaseSeeder.php に追加します。

Illuminate\Database\Seeder を使用します。

クラス DatabaseSeeder は Seeder を拡張します
{
    /**
     * データベースのシードを実行します。
     *
     * @return void
     */
    パブリック関数 run()
    {
        $this->call(PostalCodeTableSeeder::class);
        // $this->call(UsersTableSeeder::class);
    }
}
于 2016-09-23T04:34:41.707 に答える