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

我可以将mysql转储导入laravel迁移吗?,laravel,Laravel,我有一个完整的数据库,需要创建迁移。我想一定有办法在垃圾堆里做,但不确定。有什么方法可以自动或至少更容易地完成这项任务吗?Laravel无法做到这一点,但我认为这会有所帮助: 它基于现有表生成迁移。您可以使用Raahul/Larryfour包,这是一个用于Laravel 4的模型和迁移生成器 安装后,您可以使用命令行从现有数据库创建迁移,如下所示: php artisan raahul:fromdb --only yourdatabase DB::unprepared(file_get_co

我有一个完整的数据库,需要创建迁移。我想一定有办法在垃圾堆里做,但不确定。有什么方法可以自动或至少更容易地完成这项任务吗?

Laravel无法做到这一点,但我认为这会有所帮助:


它基于现有表生成迁移。

您可以使用Raahul/Larryfour包,这是一个用于Laravel 4的模型和迁移生成器

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

php artisan raahul:fromdb --only yourdatabase
DB::unprepared(file_get_contents('full/path/to/dump.sql'));
您将在app/migrations/folder中找到迁移

我有一个完整的数据库,需要创建迁移。我想一定有办法在垃圾堆里做,但不确定。有没有什么方法可以自动或至少更容易地完成这项任务

不是自动的,但是我们使用
DB::unprepared()
在迁移中运行转储。您可以使用
file\u get\u 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()
    {

    }

}

您可以使用

安装包后执行以下代码

php artisan larry:fromdb

您可以在Laravel中导入转储,如下所示:

php artisan raahul:fromdb --only yourdatabase
DB::unprepared(file_get_contents('full/path/to/dump.sql'));

但是,如果我要重构一个现有的应用程序,我会花时间从头开始编写迁移,将转储导入不同的表(或不同的数据库,如果表名相同)然后通过seed将内容导入到新结构。

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

问题是,我想在artisan:migrate操作期间导入一个相当大的表(zipcodes列表)。使用DB::unprepared($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);
只需根据需要更新查询。当然,您应该确保 “col1”、“col2”等…存在。我在导入文件之前创建了它。使用Schema::create()

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

PDO::exec(): LOAD DATA LOCAL INFILE forbidden
有一种方法可以消除此消息:虽然没有真正的文档记录,但您可以向config/database.php文件中添加一个“options”键。例如,我的如下所示:

        '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。

我最近遇到了同样的问题。我不想专门为此安装软件包,所以我决定编写一个小工具来帮助我和其他人;)

以下是链接:

如果您有任何改进建议或问题,请在此处发表意见:

在Laravel 5.2中,另一个解决方案对我有效:


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

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

使用light\Support\Facades\DB;
使用照明\支持\立面\文件;
$sql_dump=File::get('/path/to/File.sql');
DB::connection()->getPdo()->exec($sql\u dump);

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

尝试:
我正在写我的答案,因为这可能会对使用新laravel 8的人有所帮助

在laravel 8中,可以转储SQL并使用SQL(.dump)文件运行迁移。有关详细信息,请参阅下面的链接

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

此解决方案适用于具有多个字符集和排序规则的数据库MySQL数据库。当使用带有phpmyadmin的sql文件导出集时,我必须使用DB::unprepared()作为DB::statement()抛出sql语法错误。请参阅tbuteler的answer@shock_gone_wild整洁,我不知道存在。修改了答案。这可能是绝对最好的方法,尤其是当数据库变得庞大时。只要数据库服务器与Web服务器位于同一台机器上,这是一个很好的解决方案,因为
加载数据本地填充
将否则将失败。@rahmanisback否,文件路径必须是数据库服务器上文件的路径,无论该数据库位于何处。因此,如果您将转储放在远程数据库的/tmp/dump.sql中,并使用该路径调用它,它将起作用。@EllertvanKoperen是的,完全正确,但迁移脚本是应用程序代码的一部分,不应使用假设任何代码文件都将转到数据库服务器。此外,作为一个术语,迁移应与应用程序代码捆绑在一起,而不是单独上载到数据库服务器,以防数据库服务器与web服务器不同。在编写代码时,不应以数据库和应用程序的托管位置为初始前提。@rahmanisback您所说的是正确的sume和not Escape。但是远程还原确实有效,在某些情况下是一个非常重要的省时工具。我检测到输出中缺少逗号,现在它已修复。这不再支持L5Update:支持L5Update:我最近刚刚使用了此模式->迁移转换器,效果非常好:如果文件大小太大怎么办为了适应内存?这是一个完全不同的问题。您可以增加PHP的ini文件中的内存限制,或者在播种机上以编程方式这样做:
ini\u set('memory\u limit','-1')
是的,这是一个不同的问题,但是文件获取内容仍然会因“太大”而失败“文件,就像许多千兆字节。我会使用你的方法,但使用fopen和fgets。phpMyAdmin导出可以使用“插入到”有趣而优雅的方法进行分块,这种方法应该可以工作,但在我的例子中不是。如果你用垃圾桶