我可以将mysql转储导入到laravel迁移吗?

时间:2014-01-23 11:56:37

标签: laravel

我有一个完整的数据库,需要创建迁移。我想必须有一种方法从转储中做到但不确定。有没有办法自动或至少更容易完成这项任务?

11 个答案:

答案 0 :(得分:41)

您可以像这样在Laravel中导入转储:

DB::unprepared(file_get_contents('full/path/to/dump.sql'));

如果我要重构现有的应用程序,我会花时间从头开始编写迁移,将转储导入不同的表(如果表名相同,则导入不同的数据库)然后导入通过种子满足新结构。

答案 1 :(得分:19)

Laravel不能这样做,但我认为这会有所帮助:Laravel migration generator

它基于现有表格生成迁移。

答案 2 :(得分:12)

这个问题已经得到解答,但最近在一个项目中,提供的答案不再满足我的需求。它也不会导入整个数据库转储,而是导入一个(大)表。我觉得我应该和你分享。

问题是,我想在我的工匠:迁移操作期间导入一个非常大的表(zipcodes列表)。使用DB :: unrepared($ dump)的解决方案很长,我发现了一个替代方案更快

只需将您的表格导出为CSV格式,然后在迁移的up()函数中使用以下代码。

    // i had to str_replace the backslash on windows dev system... but works on linux, too
    $filename = str_replace("\\", "/", storage_path('path/in/storage/to/your/file.csv'));

    $query = "LOAD DATA LOCAL INFILE '".$filename."' INTO TABLE yourtable
        FIELDS TERMINATED BY '\t'
        ENCLOSED BY ''
        LINES TERMINATED BY '\n'
        IGNORE 0 LINES
        (col1,col2,...);";

    DB::unprepared($query);

只需根据需要更新查询。当然,你应该确保那个带有cols的表 ' col1',' col2'等...存在。我在导入文件之前创建了它。使用Schema :: create()...

如果您遇到以下错误消息:

PDO::exec(): LOAD DATA LOCAL INFILE forbidden

有一种方法可以摆脱这条消息:虽然它没有真正记录在案,但你可以添加一个'选项' config / database.php文件的关键。例如我的看起来像:

        'mysql' => [
        'driver'    => 'mysql',
        'host'      => env('DB_HOST', 'localhost'),
        'database'  => env('DB_DATABASE', 'forge'),
        'username'  => env('DB_USERNAME', 'forge'),
        'password'  => env('DB_PASSWORD', ''),
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'strict'    => false,
        'options'   => array(
            PDO::MYSQL_ATTR_LOCAL_INFILE => true,
        )

注意:我目前正在使用laravel 5,但它也适用于laravel 4。

答案 3 :(得分:9)

  

我有一个完整的数据库,需要创建迁移。我想必须有一种方法从转储中做到但不确定。有没有办法自动或至少更容易完成这项任务?

不是自动的,但我们使用DB::unprepared()在迁移中运行转储。您可以使用file_get_contents.sql文件导入,因此无需担心转义整个转储的"标记...

<?php

use Illuminate\Database\Migrations\Migration;

class ImportDump extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        DB::unprepared("YOUR SQL DUMP HERE");
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {

    }

}

答案 4 :(得分:4)

另一个解决方案在Laravel 5.2中为我工作:

DB::unprepared(File::get('full/path/to/dump.sql'));

答案 5 :(得分:4)

我正在写我的答案,因为这可能对使用新 Laravel 8 的人有所帮助。

在 laravel 8 中,可以使用 SQL(.dump) 文件转储 SQL 并运行迁移。详情请参考以下链接。

https://laravel.com/docs/8.x/migrations#squashing-migrations

php artisan schema:dump

// Dump the current database schema and prune all existing migrations...
php artisan schema:dump --prune

schema:dump 将在数据库 > 架构下创建新目录,SQL 转储将存储在那里。 之后,当您首先尝试迁移时,它将从架构运行转储文件,然后是任何挂起的迁移。

答案 6 :(得分:2)

您可以使用https://github.com/XCMer/larry-four-generator

直接从数据库创建laravel迁移和模型

安装软件包后执行以下代码

php artisan larry:fromdb

答案 7 :(得分:2)

我最近站在同一个问题面前。我不想专门为此安装一个包,所以我决定写一个小工具来帮助我和其他人;)

这是链接: http://laravel.stonelab.ch/sql-seeder-converter/

如果您有任何改进建议或问题,可以在这里发表评论: http://www.stonelab.ch/en/sql-to-laravel-seeder-converter/

答案 8 :(得分:2)

另一种选择是直接使用PDO:

$sql_dump = File::get('/path/to/file.sql');
DB::connection()->getPdo()->exec($sql_dump);

答案 9 :(得分:1)

您可以使用Raahul / Larryfour Package,Laravel 4的模型和迁移生成器

Raahul/Larryfour Package

安装完成后,您可以使用命令行从现有数据库创建迁移,如下所示:

php artisan raahul:fromdb --only yourdatabase

您将在app / migrations /文件夹中找到迁移

答案 10 :(得分:-1)

Laravel Article提供的简单解决方案,用于从现有数据库表生成迁移文件。

尝试:https://laravelarticle.com/laravel-migration-generator-online enter image description here