marcinkozak/databasemigrator

数据库迁移工具。

0.2.0 2019-09-16 19:58 UTC

This package is not auto-updated.

Last update: 2024-09-14 20:04:11 UTC


README

这是一个简单的控制台工具,它可以帮助您使用不同的数据库连接将数据从一种数据库迁移到另一种数据库。

功能

  • 定义源数据库和目标数据库连接。
  • 允许更改目标表名和列。
  • 对每行数据进行数据转换。

何时使用

有时,您可能有机会根据现有数据库创建自己的数据库,但您认为可以更好地设计它,例如,主键不是简单地命名为 id,而是使用 <table_name>_id 模式,或者列值不是您想要的。

安装

marcinkozak/databasemigrator 添加到 composer.json

"marcinkozak/databasemigrator": "dev-master"

或者简单运行

composer require marcinkozak/databasemigrator

为了使其对 Laravel 可用,打开 config/app.php 文件并添加以下行。

'providers' => array(

    // Other service providers entries
    
    MarcinKozak\DatabaseMigrator\DatabaseMigratorServiceProvider::class,
);

配置

运行以下命令

php artisan vendor:publish --provider="MarcinKozak\DatabaseMigrator\DatabaseMigratorServiceProvider"

以在应用程序根目录中发布新文件

  • config/marcinkozak/databasemigrator/connections.php
  • database/schemas/ExampleSchema.php

第一个文件包含一组连接,其中每个连接定义了源和目标数据库连接、禁用/启用状态和模式类的名称。

<?php

return [
    [
        'source'    => 'mysql2',
        'target'    => 'mysql',
        'enabled'   => true,
        'schema'    => ExampleSchema::class,
    ],
];

模式文件位于 database/schemas/ 目录中。

在开始迁移之前,您必须已定义目标表,否则将抛出异常。

示例

迁移相同名称的表
$table = new Table('table_name');
迁移不同名称的表
$table = new Table('source_table_name', 'target_table_name');
定义列

这是使迁移对所选表起作用所必需的步骤。您可以定义单个列

$column = new Column('column_name');
$table->addColumn($column);

或不同名称的列

$column = new Column('source_column_name', 'target_column_name');
$table->addColumn($column);

或使用 schema() 方法在单个步骤中定义多列。

$table->schema([
    'column_1',
    'column_2',
    //...
]);

当然,您可以在上述方法内部定义不同的名称。

$table->schema([
    'source_column_1' => 'target_column_1',
    'source_column_2' => 'target_column_2',
    //...
]);
转换列值

我们并不总是希望将某些列的值迁移到相同的位置。该包支持 map() 方法,允许将值转换为新的值。要使用它,只需定义新的 Column 实例。

$column = new Column('column_name');
$column->map(function($value) {
    return $value . '_some_stupid_word';
});

如果您想创建在源表中设计得较差的关系,可以按照这种方式操作

$data = DB::table('some_table')->pluck('id', 'some_column_name');

$column = new Column('column_name');
$column->map(function($value) use($data) {
    return array_get($data, $value);
});

假设在这种情况下,$value 存储与 some_column_name 列相同的值。通过使用 array_get 函数,我们可以获取所需的唯一键并将其用作 map 方法中新的外键。

运行迁移

该包有两个 Artisan 方法。

填充目标表

php artisan database-migrator:populate

清除目标表

php artisan database-migrator:clear