yajra / laravel-sql-loader
Laravel 的 Oracle SQL Loader
Requires
- php: ^8.2
- ext-oci8: >=3.0.1
- ext-pdo: *
- illuminate/database: ^10.0|^11.0
- illuminate/filesystem: ^10.0|^11.0
- illuminate/support: ^10.0|^11.0
- yajra/laravel-oci8: ^10.6|^11.3
Requires (Dev)
- larastan/larastan: ^2.9.7
- laravel/pint: ^1.16
- mockery/mockery: ^1.6.12
- orchestra/testbench: ^9.1.1
- pestphp/pest: ^2.34.7
- pestphp/pest-plugin-laravel: *
- rector/rector: ^1.1
README
一个 Laravel 包,允许您使用 sqlldr
轻松将数据加载到 Oracle 数据库。
要求
- 带有工具包的 Oracle Instant Client
- Laravel 10.x 或更高版本
- Laravel OCI8 10.x 或更高版本
先决条件
- 在您可以使用此包之前,您需要安装带有工具包的 Oracle Instant Client。您可以从 Oracle 网站 下载该包。
- 您还应注意
sqlldr
可执行文件的位置。- 例如,如果您将带有工具包的 Oracle Instant Client 安装在
/usr/local/oracle/instantclient_19_6
,则sqlldr
可执行文件将位于/usr/local/oracle/instantclient_19_6/sqlldr
。 - 您还可以将
sqlldr
可执行文件路径添加到系统环境变量 PATH 中。 - 您还可以使用
SQL_LOADER_PATH
键在.env
文件中设置sqlldr
可执行文件的路径。 - 您还可以使用
sqlldr
键在config/sql-loader.php
文件中设置sqlldr
可执行文件的路径。 - 您可以使用以下命令将
sqlldr
可执行文件符号链接到/usr/local/bin
sudo ln -nfs /usr/local/oracle/instantclient_19_6/sqlldr /usr/local/bin/sqlldr
- 例如,如果您将带有工具包的 Oracle Instant Client 安装在
- 还需要了解如何使用
sqlldr
。您可以在 这里 阅读文档。
安装
您可以通过 composer 安装此包
composer require yajra/laravel-sql-loader:^1.0
快速入门
以下是使用此包的快速示例
Route::get('sql-loader', function () { Schema::dropIfExists('employees'); Schema::create('employees', function ($table) { $table->id(); $table->string('name'); $table->integer('dept_id'); $table->timestamps(); }); Yajra\SQLLoader\CsvFile::make(database_path('files/employees.csv'), 'w') ->headers(['name', 'dept_id', 'created_at', 'updated_at']) ->insert([ ['John Doe', 1, now(), now()], ['Jane Doe', 2, now(), now()], ['John Doe', 1, now(), now()], ['Jane Doe', 2, now(), now()], ]) ->close(); $loader = Yajra\SQLLoader\SQLLoader::make(); $loader->inFile(database_path('files/employees.csv')) ->dateFormat('YYYY-MM-DD HH24:MI:SS') ->withHeaders() ->into('employees') ->execute(); return DB::table('employees')->get(); });
执行模式
默认执行模式是 Mode::APPEND
。该包支持以下执行模式
Yajra\SQLLoader\Mode::INSERT
- 将数据插入到表中。Yajra\SQLLoader\Mode::APPEND
- 将数据追加到表中。Yajra\SQLLoader\Mode::REPLACE
- 替换表中的数据。Yajra\SQLLoader\Mode::TRUNCATE
- 截断表然后插入数据。
日期格式
SQL*Loader 默认日期格式为 YYYY-MM-DD"T"HH24:MI:SS."000000Z"
,以匹配 Laravel 的模型日期序列化。您可以使用 dateFormat
方法更改日期格式。
$loader->dateFormat('YYYY-MM-DD HH24:MI:SS');
可用方法
选项
您可以使用 options
方法将额外的选项传递给 sqlldr
命令。
$loader->options(['skip=1', 'load=1000']);
输入文件(/s)
您可以使用 inFile
方法设置用于 SQL*Loader 命令的输入文件。
$loader->inFile(database_path('files/employees.csv'));
您还可以设置多个输入文件。
$loader->inFile(database_path('files/employees.csv')) ->inFile(database_path('files/departments.csv')),
模式
您可以使用 mode
方法设置执行模式。
$loader->mode(Yajra\SQLLoader\Mode::TRUNCATE);
到表
您可以使用 into
方法设置要加载数据的表。此方法接受以下参数
table
- 指定要加载数据的表。columns
- SQL*Loader控制文件中的字段列表部分提供了有关正在加载的字段的信息。terminatedBy
- 结束字符。enclosedBy
- 包围字符。trailing
- 设置为true
以配置SQL*Loader将缺失的列视为null列。formatOptions
- 在表级别指定日期时间格式。when
- 指定应用于从数据文件中读取的所有数据记录的WHEN子句。
$loader->into('employees', ['name', 'dept_id']);
使用标题
使用withHeaders
将跳过CSV文件的第一行。
重要
withHeaders
必须在into
方法之前调用。- 此方法假定标题与表列相同。
- 不存在的列将标记为
FILLER
。 - 日期标题将被自动检测,并在控制文件中附加数据类型。
- 日期值必须遵循默认的日期格式。如果不这样做,请使用
dateFormat
方法。 - 如果标题与表列不同,您应该在
into
方法中定义columns
。
从Eloquent Collection构建CSV文件
$users = User::all(); Yajra\SQLLoader\CsvFile::make(database_path('files/users.csv'), 'w') ->headers(array_keys($users->first()->toArray())) ->insert($users->toArray()) ->close();
带有标题加载CSV文件
从oracle
数据库连接加载用户到backup
数据库连接。
$loader->inFile(database_path('files/users.csv')) ->withHeaders() ->mode(Yajra\SQLLoader\Mode::TRUNCATE) ->connection('backup') ->into('users') ->execute();
带有标题的通配符路径
当使用通配符路径时,假定第一个文件包含标题。后续文件不应有标题,否则将报告为无效记录。
$loader->inFile(database_path('files/*.csv')) ->withHeaders() ->mode(Yajra\SQLLoader\Mode::TRUNCATE) ->into('employees') ->execute();
- employees-1.csv
name,dept_id
John Doe,1
Jane Doe,2
- employees-2.csv
John Doe,1
Jane Doe,2
常量
在某些情况下,我们需要向表中插入常量值。您可以使用constants
方法设置常量值。
重要
constants
必须在into
方法之前调用。
$loader->withHeaders() ->constants([ 'file_id CONSTANT 1', 'created_at EXPRESSION "current_timestamp(3)"', 'updated_at EXPRESSION "current_timestamp(3)"', ]) ->into('users');
连接
您可以使用connection
方法设置用于SQL*Loader命令的连接名称。
$loader->connection('oracle');
磁盘
您可以使用disk
方法设置用于控制文件的磁盘。
$loader->disk('local');
日志
您可以使用logs
方法获取执行日志。
return nl2br($loader->logs());
自定义控制文件
您可以通过将控制文件名传递给as
方法来使用自定义控制文件。
$loader->as('employees.ctl');
执行
您可以使用execute
方法执行SQL*Loader命令。
$loader->execute();
您还可以设置以秒为单位的执行超时。默认为3600秒/1小时。
$loader->execute(60);
执行结果
您可以使用successfull
方法检查执行是否成功。
if ($loader->successfull()) { return 'Data loaded successfully!'; }
处理结果
您可以使用result
方法获取处理结果。
$result = $loader->result();
使用数组作为数据源
您可以使用beginData
方法使用数组作为数据源。
$loader = Yajra\SQLLoader\SQLLoader::make(); $loader->beginData([ ['John', 1], ['Jane', 1], ['Jim, K', 2], ['Joe', 2], ]) ->mode(Yajra\SQLLoader\Mode::TRUNCATE) ->into('employees', [ 'name', 'dept_id', ]) ->execute();
可用配置
您可以使用以下命令发布配置文件
php artisan vendor:publish --provider="Yajra\SQLLoader\SQLLoaderServiceProvider" --tag="config"
连接配置
您可以为SQL*Loader命令设置要使用的连接名称。
'connection' => env('SQL_LOADER_CONNECTION', 'oracle'),
SQL*Loader路径配置
您可以为SQL*Loader可执行文件设置路径。
'sqlldr' => env('SQL_LOADER_PATH', '/usr/local/bin/sqlldr'),
磁盘配置
您可以为控制文件设置要使用的磁盘。
'disk' => env('SQL_LOADER_DISK', 'local'),
鸣谢
许可
MIT许可证。请参阅许可文件获取更多信息。