yajra/laravel-sql-loader

Laravel 的 Oracle SQL Loader

v1.8.1 2024-06-28 07:19 UTC

README

Continuous Integration Static Analysis Latest Stable Version Total Downloads License

一个 Laravel 包,允许您使用 sqlldr 轻松将数据加载到 Oracle 数据库。

要求

先决条件

  • 在您可以使用此包之前,您需要安装带有工具包的 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
  • 还需要了解如何使用 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文件的第一行。

重要

  1. withHeaders必须在into方法之前调用。
  2. 此方法假定标题与表列相同。
  3. 不存在的列将标记为FILLER
  4. 日期标题将被自动检测,并在控制文件中附加数据类型。
  5. 日期值必须遵循默认的日期格式。如果不这样做,请使用dateFormat方法。
  6. 如果标题与表列不同,您应该在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许可证。请参阅许可文件获取更多信息。