# Migration From an Existing Database | Laravel
###### tags: `database`, `laravel`
## Intro
I got a mission to clone an existing service, which has its database separately from the original.
Here is my to-do list:
1. create tables
2. sync data
This article will only record the first step. the next step will be written in the second episode.
## How to create tables from the existing database
Since this project is a Laravel app, but without migration files so I came out with 2 solutions:
1. Create migrations from the existing database, then run `php artisan migrate` to create the same tables to my new database
2. Create create-table-SQLs from the existing database, then somehow run these SQLs
### Migration Generator
I thought the first one is more ideal since it is easier for other developers to maintain so I googled "laravel create migration ..." then google returned me a bunch of packages to do these tasks, nice!
here is a couple of choices:
- composer package:
- https://github.com/Xethron/migrations-generator
- https://github.com/barryvdh/laravel-migration-generator
- https://github.com/adamkearsley/laravel-convert-migrations
- online convertor
- https://laravelarticle.com/laravel-migration-generator-online
So I generated all the migrations in seconds, lovely!
Then I run `php artisan migrate`!
CRASH!
Checked out the migrations, found that the generator didn't generate the codes properly. It missed some details, like lacking index, so I needed to go through each file to debug... which was not my purpose to use a tool so I tried the second solution, create tables by pure SQL
### How to Execute SQL Files in Laravel
It is easier than I thought
```php
use Illuminate\Support\Facades\DB;
DB::unprepared(file_get_contents('path/to/sql.sql'));
```
I test a table and it worked properly, created exactly same table as the original without error
## Implement
So I exported the table structure in SQL from phpMyAdmin manually (the total number of tables is still acceptable for me to do this).
Instead of creating a command to do this task, I still generated migrations matched to the tables since I would like to have the ROLLBACK feature in Laravel migration. Remember? We can create migrations in seconds by using one of the mentioned packages. Don't forget to edit `.env` to switch to the original database, And after generating, switch back to the NEW database.
Here is my migration code. I put all the SQL in `database/sql_migrations` but you can put them anywhere you like.
```php=
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
class CreateNewTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
$sqlpath = 'database/sql_migrations/'.basename(__FILE__, ".php").'.sql';
Illuminate\Support\Facades\DB::unprepared(file_get_contents($sqlpath));
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('new');
}
}
```
After all files are set, we can easily run `php artisan migrate` to create tables, and `php artisan migrate:rollback` to rollback.
[Sync Data From an Existing Database | Laravel](/jFakKXclRLux5gXoeqWWAA)