【问题标题】:Laravel Raw Bulk insertLaravel 原始批量插入
【发布时间】:2016-12-08 02:28:42
【问题描述】:

我在 Laravel 框架中使用的控制器中编写了一个函数。该函数获取 *.csv 文件的文件路径,然后使用原始批量插入语句将此 *.csv 文件的所有元素插入到数据库中。问题是执行函数时元素没有放入数据库表中。我也没有收到任何错误。当我在 SQL Server 管理器中执行查询时,它会毫无问题地插入元素。我做错了什么,有没有更好的方法将 csv 文件的元素批量插入数据库?

这是函数的代码:

        public static function bulkInsertCSV($filePath){

            $sql = "use [testDatabase] BULK INSERT [dbo].[testTable]   
                    FROM '" . $filePath . "' WITH (FIELDTERMINATOR = ';',"
                    . "ROWTERMINATOR = '\\n' );";
            //DB::statement($sql);
            DB::statement(DB::raw($sql));
        }

最好的问候, 亚尔辛

【问题讨论】:

    标签: php laravel laravel-5 laravel-5.2


    【解决方案1】:

    我喜欢使用laravel-excel 库来处理我的 CSV 文件,它让我更容易管理并且感觉更“laravel-y”。

    laravel/excel 图书馆:http://www.maatwebsite.nl/laravel-excel/docs/getting-started#installation 图书馆。

    然后你要做的有点简单:

    Excel::filter('chunk')->load($filePath)->chunk(500, function($rows){
        foreach($rows as $row) {
            $data = collect([]);
            foreach(App\TestTable::getFillable() as $fillable ) {
                if (isset($row[$fillable])) {
                   $data->put($fillable, $row[$fillable]);
                }
            }
    
            App\TestTable::create($data->toArray());
        }
    });
    

    注意事项:

    • 使用chunk 可确保我们不会耗尽内存。
    • getFillable() 方法假定您在 TestTable 模型上定义了 protected $fillable = []; 属性。
    • testTable 中的 column namescsvfile 中的 column names 匹配。

    希望这对您有所帮助。

    【讨论】:

    • 这将是一个很好的解决方案,但我忘了说 csv 最多可以包含 1.000.000 行和很多列。我已经用 PHPExcel 试过了,它真的很慢(插入操作大约需要 10 分钟)。您的解决方案大约需要 7 分钟。它还是太多了。在 SQL 中使用 BULK INSERT 大约需要 1 分钟。所以你的解决方案不是我正在寻找的解决方案,但无论如何谢谢:)。
    猜你喜欢
    • 2018-10-23
    • 1970-01-01
    • 2018-01-11
    • 2019-10-24
    • 2016-10-03
    • 1970-01-01
    • 2017-06-11
    • 2019-01-30
    • 1970-01-01
    相关资源
    最近更新 更多