溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Laravel Seeder怎么生成百萬模擬數(shù)據(jù)

發(fā)布時(shí)間:2021-03-29 09:03:06 來源:億速云 閱讀:169 作者:小新 欄目:編程語(yǔ)言

這篇文章主要介紹了Laravel Seeder怎么生成百萬模擬數(shù)據(jù),具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

Laravel 集成了 Faker 庫(kù),并提供了 Seeder 可以幫助我們輕松地生成模擬數(shù)據(jù)。

先書寫數(shù)據(jù)倉(cāng)庫(kù)和數(shù)據(jù)填充代碼

數(shù)據(jù)倉(cāng)庫(kù)代碼

use App\Models\Topic;use Faker\Generator as Faker;$factory->define(Topic::class, function (Faker $faker) {

    $sentence = $faker->sentence();

    // 隨機(jī)取一個(gè)月以內(nèi)的時(shí)間
    $updated_at = $faker->dateTimeThisMonth();

    // 傳參為生成最大時(shí)間不超過,因?yàn)閯?chuàng)建時(shí)間永遠(yuǎn)比更改時(shí)間要早
    $created_at = $faker->dateTimeThisMonth($updated_at);

    return [
        'title' => $sentence,
        'body' => $faker->text(),
        'excerpt' => $sentence,
        'created_at' => $created_at,
        'updated_at' => $updated_at,
    ];});

數(shù)據(jù)填充代碼

 class TopicsTableSeeder extends Seeder{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // 所有用戶ID數(shù)組,如:[1,2,3,4]
        $user_ids = User::all()->pluck('id')->toArray();

        // 所有分類 ID 數(shù)組,如:[1,2,3,4]
        $category_ids = Category::all()->pluck('id')->toArray();

        // 獲取 Faker 實(shí)例
        $faker = app(Faker\Generator::class);

        $topics = factory(Topic::class)
            ->times(1000)
            ->make()
            ->each(function ($topic, $index) use ($user_ids, $category_ids, $faker){
                // 從用戶 ID 數(shù)組中隨機(jī)取出一個(gè)并賦值
                $topic->user_id = $faker->randomElement($user_ids);

                // 話題分類,同上
                $topic->category_id = $faker->randomElement($category_ids);
            });

        // 將數(shù)據(jù)集合轉(zhuǎn)換為數(shù)組,并插入到數(shù)據(jù)庫(kù)中
        Topic::insert($topics->toArray());
    }}

我們通過是 times() 設(shè)置了填充的次數(shù),執(zhí)行數(shù)據(jù)填充命令,可以將 1000 條數(shù)據(jù)填充至 topics 表中,這很方便。

php artisan db:seed --class=TopicsTableSeeder

如果我們想要插入 100w 條數(shù)據(jù),是不是把 times() 的參數(shù)改為 1000,000 就可以了?當(dāng)你這樣做之后,你會(huì)發(fā)現(xiàn)如下報(bào)錯(cuò)

General error: 1390 Prepared statement contains too many placeholders

這個(gè)問題是因?yàn)?mysql 默認(rèn)支持的占位符最多為 65535(2^16-1) 個(gè),寫入數(shù)據(jù)為 m 列,n 行。m*n 必須小于 65535。

所以沒法一次性插入大量數(shù)據(jù),查了一下 php artisan db:seed 也沒有提供執(zhí)行次數(shù)的相關(guān)參數(shù)。

最后,決定使用 shell 腳本進(jìn)行解決。

for (( i = 0; i < 1000; i++ )); do
    /usr/local/bin/php artisan db:seed --class=TopicsTableSeederdone

等待片刻,你會(huì)發(fā)現(xiàn) 100w 數(shù)據(jù)已經(jīng)生成完畢!

PS:數(shù)據(jù)倉(cāng)庫(kù)和數(shù)據(jù)填充代碼來自 larabbs

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Laravel Seeder怎么生成百萬模擬數(shù)據(jù)”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI