Laravel 5.5: chow to clean/drop db data (not schema!) 并使用 seeder 重置自动增量
Laravel 5.5: chow to clean/drop db data (not schema!) and reset auto-increment using seeder
我使用 laravel 创建 PHPunit 测试。对于每个测试,我都需要 "reset" 数据库,但是删除所有 table 并设置模式非常慢(在 mysql 上)——所以我不想更改模式,而只删除数据和为每个 table.
重置 AUTO-INCREMENT 计数器
我如何使用播种机做到这一点?
因为我无法在网上轻松找到解决方案 - 所以在我研究之后,我创建了播种机,留在这里供后代使用;)
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class CleanTablesSeeder extends Seeder
{
public function run()
{
$rows = DB::select('SHOW TABLES');
$tables = array_column($rows, 'Tables_in_'.env('DB_DATABASE'));
$this->clean($tables);
}
private function clean($tables)
{
Model::unguard();
foreach ($tables as $table) {
DB::table($table)->delete();
DB::statement('ALTER TABLE '.$table.' AUTO_INCREMENT = 0;');
}
}
}
结果
我的数据库中有 22 tables(每个 table 平均 10 列),5 tables 的播种机数据很少。对于在测试中调用 Artisan::call(...)
,时间如下:
17.83[s]
对于 php artisan migrate:fresh --seed
5.56[s]
for php artisan db:seed
(使用上面的家宴)
正如我们所见,播种器比从头开始设置模式快 3 倍多 - 这为编写自动测试的开发人员提供了动力:)
我使用 laravel 创建 PHPunit 测试。对于每个测试,我都需要 "reset" 数据库,但是删除所有 table 并设置模式非常慢(在 mysql 上)——所以我不想更改模式,而只删除数据和为每个 table.
重置 AUTO-INCREMENT 计数器我如何使用播种机做到这一点?
因为我无法在网上轻松找到解决方案 - 所以在我研究之后,我创建了播种机,留在这里供后代使用;)
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class CleanTablesSeeder extends Seeder
{
public function run()
{
$rows = DB::select('SHOW TABLES');
$tables = array_column($rows, 'Tables_in_'.env('DB_DATABASE'));
$this->clean($tables);
}
private function clean($tables)
{
Model::unguard();
foreach ($tables as $table) {
DB::table($table)->delete();
DB::statement('ALTER TABLE '.$table.' AUTO_INCREMENT = 0;');
}
}
}
结果
我的数据库中有 22 tables(每个 table 平均 10 列),5 tables 的播种机数据很少。对于在测试中调用 Artisan::call(...)
,时间如下:
17.83[s]
对于php artisan migrate:fresh --seed
5.56[s]
forphp artisan db:seed
(使用上面的家宴)
正如我们所见,播种器比从头开始设置模式快 3 倍多 - 这为编写自动测试的开发人员提供了动力:)