ellgreen / laravel-loadfile
一个帮助将文件加载到MySQL表的包
3.1.0
2024-03-16 09:19 UTC
Requires
- php: ^8.1
- illuminate/database: ^9.0|^10.0|^11.0
Requires (Dev)
- nunomaduro/larastan: ^2.0
- orchestra/testbench: ^7.0|^8.0|^9.0
- phpunit/phpunit: ^9|^10.5
- squizlabs/php_codesniffer: ^3.6
- vimeo/psalm: ^4.7|^5.22
README
一个帮助将文件加载到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