ellgreen/laravel-loadfile

一个帮助将文件加载到MySQL表的包

3.1.0 2024-03-16 09:19 UTC

This package is auto-updated.

Last update: 2024-09-16 10:18:17 UTC


README

Latest Stable Version License

一个帮助将文件加载到MySQL表的包。

它使用MySQL的LOAD DATA语句快速将文本文件加载到您的数据库中。

根据:[https://dev.mysqlserver.cn/doc/refman/8.0/en/insert-optimization.html](https://dev.mysqlserver.cn/doc/refman/8.0/en/insert-optimization.html),这通常比使用INSERT语句快20倍。

选项

此库目前可以处理正常LOAD DATA语句中的任何选项,但不能处理分区表支持。这将在laravel-loadfile的未来版本中包含。

有关可以传递给加载文件构建器的以下选项的更多信息,请参阅以下链接

https://dev.mysqlserver.cn/doc/refman/8.0/en/load-data.html

安装

需要 > PHP 8.1 和 > Laravel 9

此库通过之前的主要版本支持旧版本的Laravel和PHP。

composer require ellgreen/laravel-loadfile

加载文件

要使用本地文件,您需要为客户端和服务器启用 local_infile。在Laravel侧,您需要将以下内容添加到数据库配置的 options 部分

'config' => [
    PDO::MYSQL_ATTR_LOCAL_INFILE => true,
],

简单文件导入

use EllGreen\LaravelLoadFile\Laravel\Facades\LoadFile;

LoadFile::file('/path/to/employees.csv', $local = true)
    ->into('employees')
    ->columns(['forename', 'surname', 'employee_id'])
    ->load();

忽略标题行

LoadFile::file('/path/to/employees.csv', $local = true)
    ->into('employees')
    ->columns(['forename', 'surname', 'employee_id'])
    ->ignoreLines(1)
    ->load();

指定字段选项

LoadFile::file('/path/to/employees.csv', $local = true)
    ->into('employees')
    ->columns(['forename', 'surname', 'employee_id'])
    // like this
    ->fieldsTerminatedBy(',')
    ->fieldsEscapedBy('\\\\')
    ->fieldsEnclosedBy('"')
    // or
    ->fields(',', '\\\\', '"')
    ->load();

指定行选项

LoadFile::file('/path/to/employees.csv', $local = true)
    ->into('employees')
    ->columns(['forename', 'surname', 'employee_id'])
    // like this
    ->linesStartingBy('')
    ->linesTerminatedBy('\\n')
    // or
    ->lines('', '\\n')
    ->load();

输入预处理(设置)

LoadFile::file('/path/to/employees.csv', $local = true)
    ->into('employees')
    ->columns([
        DB::raw('@forename'),
        DB::raw('@surname'),
        'employee_id',
    ])
    ->set([
        'name' => DB::raw("concat(@forename, ' ', @surname)"),
    ])
    ->load();

使用不同的连接

LoadFile::connection('mysql')
    ->file('/path/to/employees.csv', $local = true)
    ->into('employees')
    ->columns(['forename', 'surname', 'employee_id'])
    ->load();

重复键和错误处理

LoadFile::connection('mysql')
    ->file('/path/to/employees.csv', $local = true)
    ->replace()
    // or
    ->ignore()
    ->into('employees')
    ->load();

将数据加载到Eloquent模型中

只需将 LoadsFiles 特性添加到您的模型中,如下所示

use EllGreen\LaravelLoadFile\Laravel\Traits\LoadsFiles;

class User extends Model
{
    use LoadsFiles;
}

然后您可以使用以下方法将该文件加载到该表中

User::loadFile('/path/to/users.csv', $local = true);

需要指定选项以加载文件吗?

将以下方法添加到您的模型中

class User extends Model
{
    use LoadsFiles;

    public function loadFileOptions(Builder $builder): void
    {
        $builder
            ->fieldsTerminatedBy(',')
            ->ignoreLines(1);
    }
}

或者,您可以在需要时动态获取查询构建器的实例

User::loadFileBuilder($file, $local)
    ->replace()
    ->ignoreLines(1)
    ->load();

开发

单元测试

composer test-unit

所有测试

您需要安装docker才能使用这些。

composer check