I got several .sql files of countries, states and cities of the world from github. How can I run them with Laravel's seed files to populate those tables in my database?

5

Best Answer


  1. Add DB::unprepared() to the run method of DatabaseSeeder.
  2. Run php artisan db:seed at the command line.

    class DatabaseSeeder extends Seeder {public function run(){Eloquent::unguard();$this->call('UserTableSeeder');$this->command->info('User table seeded!');$path = 'app/developer_docs/countries.sql';DB::unprepared(file_get_contents($path));$this->command->info('Country table seeded!');}}

I found a package that creates seed files from database tables and rows. It currently supports Laravel 4 through 10:

https://github.com/orangehill/iseed

In the end, it's basically as easy as this:

php artisan iseed my_table

or for multiple occasions:

php artisan iseed my_table,another_table

As used by other answers, DB::unprepared does not work with more complex SQL files.

Another better solution would be to use the MySQL cli directly inside a process:

$process = new Process(['mysql','-h',DB::getConfig('host'),'-u',DB::getConfig('username'),'-p' . DB::getConfig('password'),DB::getConfig('database'),'-e',"source path/to/schema.sql"]);$process->mustRun();

2022 Simplified answer from Andrew Koper :

class WhateverSeeder extends Seeder{/*** Run the database seeds.** @return void*/public function run(){$file_path = resource_path('sql/whatever.sql');\DB::unprepared(file_get_contents($file_path));}}

Fun fact: 60,000 rows took me 50s to import from JSON file where this took only 400ms.

@Andre Koper solutions is understandable, but sadly it doesn't work for me. This one is a bit confusing but atleast works for me.

So instead of using DB::unprepared, I use this:

// DatabaseSeeder.phpclass DatabaseSeeder extends Seeder {public function run(){// Set the path of your .sql file$sql = storage_path('a_id_territory.sql');// You must change this one, its depend on your mysql bin.$db_bin = "C:\wamp64\bin\mariadb\mariadb10.3.14\bin";// PDO Credentials$db = ['username' => env('DB_USERNAME'),'password' => env('DB_PASSWORD'),'host' => env('DB_HOST'),'database' => env('DB_DATABASE')];exec("{$db_bin}\mysql --user={$db['username']} --password={$db['password']} --host={$db['host']} --database {$db['database']} < $sql");}}

Then while migrating database just add --seed

php artisan migrate:refresh --seed

or

php artisan migrate:fresh --seed

Tested on Laravel 7.0.x