数据库迁移

迁移是一种有条理、有组织的方式更改数据库的便捷方式。你可以手动编辑SQL的片段,然后你要负责告诉其他开发人员他们也需要去运行这段SQL。你还必须跟踪下次部署时需要对生产机器运行哪些更改。

数据库表**迁移**会跟踪已经运行的迁移,因此您只需更新应用程序文件并调用$migration->current()以确定应运行哪些迁移。当前版本位于**application/Config/Migrations.php**中。

  • 迁移文件名
  • 创建迁移
  • 使用$currentVersion
    • 数据库组
    • 命名空间
    • 用法示例
  • 命令行工具
  • 迁移参数
  • 类参考

迁移文件名

每个迁移都按数字顺序向前或向后运行,具体取决于所采用的方法。有两种编号样式可供选择:

  • 顺序:每个迁移按顺序编号,从001开始。每个数字必须是三位数,并且序列中不得有任何间隙。(这是CodeIgniter 3.0之前的编号方案。)
  • 时间戳:使用创建迁移时的时间戳对每个迁移进行编号,格式为**YYYYMMDDHHIES**格式(例如**20121031100537**)。这有助于防止在团队环境中工作时出现编号冲突,并且是CodeIgniter 3.0及更高版本中的首选方案。

可以使用*application/Config/Migrations.php*文件中的$type设置选择所需的样式。默认设置为时间戳。

无论您选择使用哪种编号样式,请在迁移文件前加上迁移编号,后跟下划线和迁移的描述性名称。例如:

  • 001_add_blog.php(顺序编号)
  • 20121031100537_add_blog.php(时间戳编号)

创建迁移

这将是新博客站点的首次迁移。所有迁移都在 application/Database/Migrations/ 目录中,并命名,如 20121031100537_Add_blog.php

<?php namespace App\Database\Migrations;

use CodeIgniter\Database\Migration;

class AddBlog extends Migration
{

        public function up()
        {
                $this->forge->addField([
                        'blog_id'          => [
                                'type'           => 'INT',
                                'constraint'     => 5,
                                'unsigned'       => true,
                                'auto_increment' => true,
                        ],
                        'blog_title'       => [
                                'type'           => 'VARCHAR',
                                'constraint'     => '100',
                        ],
                        'blog_description' => [
                                'type'           => 'TEXT',
                                'null'           => true,
                        ],
                ]);
                $this->forge->addKey('blog_id', true);
                $this->forge->createTable('blog');
        }

        public function down()
        {
                $this->forge->dropTable('blog');
        }
}

然后在 application/Config/Migrations.php 中设置 $currentVersion = 20121031100537;。

数据库连接和数据库Forge类都可以通过 $this->db和$this->forge分别使用。

或者,你可以使用命令行调用来生成框架迁移文件。请参阅下面的更多细节。

使用$currentVersion

$currentVersion设置允许你标记应用程序命名空间应设置的位置。这对于在生产环境中使用尤其有用。在你的应用程序中,你始终可以将迁移更新到当前版本,而不是最新版本,以确保生产和登台服务器正在运行正确的架构。在开发服务器上,你可以为尚未准备好生产的代码添加其他迁移。通过使用该latest()方法,你可以确保你的开发机器始终运行前沿架构。

数据库组

只能针对单个数据库组运行迁移。如果 在application/Config/Database.php 中定义了多个组 ,则它将针对该$defaultGroup同一配置文件中指定的组运行。有时你可能需要为不同的数据库组使用不同的模式。也许你有一个用于所有常规站点信息的数据库,而另一个数据库用于关键任务数据。通过$DBGroup在迁移上设置属性,可以确保仅针对正确的组运行迁移。此名称必须与数据库组的名称完全匹配:

class Migration_Add_blog extends \CodeIgniter\Database\Migration
{
  protected $DBGroup = 'alternate_db_group';

  public function up() { . . . }

  public function down() { . . . }
}

命名空间

迁移库可以自动扫描你在 application/Config/Autoload.php 中定义的所有名称空间 及其$psr4属性以匹配目录名称。它将包括它在Database/Migrations中找到的所有迁移。

每个命名空间都有自己的版本序列,这将帮助您升级和降级每个模块(命名空间),而不会影响其他命名空间。

例如,假设我们在Autoload配置文件中定义了以下命名空间:

$psr4 = [
        'App'       => APPPATH,
        'MyCompany' => ROOTPATH.'MyCompany'
];

这将查找位于**APPPATH/Database/Migrations**和**ROOTPATH/Database/Migrations**的任何迁移。这使得在可重用的模块化代码套件中包含迁移变得简单。

用法示例

在此示例中,一些简单的代码放在 application/Controllers/Migrate.php 中以更新架构:

<?php

class Migrate extends \CodeIgniter\Controller
{

        public function index()
        {
                $migrate = \Config\Services::migrations();

                try
                {
                $migrate->current();
                }
                catch (\Exception $e)
                {
                  // Do something with the error here...
                }
        }

}

命令行工具

CodeIgniter附带了几个:doc:commands </cli/cli_commands>,它们可以从命令行获得,以帮助你处理迁移。这些工具不需要使用迁移,但可能会使那些希望使用它们的人更容易。这些工具主要提供对MigrationRunner类中可用的相同方法的访问。

migrate

Migrates a database group with all available migrations:

> php spark migrate

You can use (migrate) with the following options:

  • -g - to chose database group, otherwise default database group will be used.
  • -n - to choose namespace, otherwise (App) namespace will be used.
  • -all - to migrate all namespaces to the latest migration

This example will migrate Blog namespace with any new migrations on the test database group:

> php spark migrate -g test -n Blog

When using the -all option, it will scan through all namespaces attempting to find any migrations that have not been run. These will all be collected and then sorted as a group by date created. This should help to minimize any potential conflicts between the main application and any modules.

rollback

回滚所有迁移,将所有数据库组转为空白平板,有效迁移0:

> php spark migrate:rollback

你可以使用(rollback)以下选项:

  • (-g)选择数据库组,否则将使用默认数据库组。
  • (-n)选择名称空间,否则将使用(App)名称空间。
  • (all)将所有名称空间迁移到最新的迁移

refresh

首先回滚所有迁移,然后迁移到最新版本,刷新数据库状态:

> php spark migrate:refresh

你可以使用(refresh)以下选项:

  • (-g)选择数据库组,否则将使用默认数据库组。
  • (-n)选择名称空间,否则将使用(App)名称空间。
  • (all)将所有名称空间迁移到最新的迁移

status

显示所有迁移的列表及其运行的日期和时间,如果尚未运行,则显示’–’:

> php spark migrate:status
Filename               Migrated On
First_migration.php    2016-04-25 04:44:22

你可以使用(status)以下选项:

  • (-g)选择数据库组,否则将使用默认数据库组。

make:migration

Creates a skeleton migration file in app/Database/Migrations. It automatically prepends the current timestamp. The class name it creates is the Pascal case version of the filename.

> php spark make:migration <class> [options]

You can use (make:migration) with the following options:

  • -n - to choose namespace, otherwise the value of APP_NAMESPACE will be used.
  • -force - If a similarly named migration file is present in destination, this will be overwritten.

迁移参数

以下是 app/Config/Migrations.php 中提供的所有迁移配置选项的表。

参数 默认值 可选项 描述
enabled true true / false 启用或者禁用迁移
table migrations None 用于存储当前版本的数据库表名
timestampFormat Y-m-d-His_   The format to use for timestamps when creating a migration.

类参考

class CodeIgniterDatabaseMigrationRunner
current($group)
参数:
  • $group (mixed) – database group name, if null (App) namespace will be used.
返回:

TRUE if no migrations are found, current version string on success, FALSE on failure

返回类型:

mixed

Migrates up to the current version (whatever is set for $currentVersion in application/Config/Migrations.php).

findMigrations()
返回:An array of migration files
返回类型:array

An array of migration filenames are returned that are found in the path property.

latest($namespace, $group)
参数:
  • $namespace (mixed) – application namespace, if null (App) namespace will be used.
  • $group (mixed) – database group name, if null default database group will be used.
返回:

Current version string on success, FALSE on failure

返回类型:

mixed

This works much the same way as current() but instead of looking for the $currentVersion the Migration class will use the very newest migration found in the filesystem.

latestAll($group)
参数:
  • $group (mixed) – database group name, if null default database group will be used.
返回:

TRUE on success, FALSE on failure

返回类型:

mixed

This works much the same way as latest() but instead of looking for one namespace, the Migration class will use the very newest migration found for all namespaces.

version($target_version, $namespace, $group)
参数:
  • $namespace (mixed) – application namespace, if null (App) namespace will be used.
  • $group (mixed) – database group name, if null default database group will be used.
  • $target_version (mixed) – Migration version to process
返回:

TRUE if no migrations are found, current version string on success, FALSE on failure

返回类型:

mixed

Version can be used to roll back changes or step forwards programmatically to specific versions. It works just like current() but ignores $currentVersion.

$migration->version(5);
setNamespace($namespace)
参数:
  • $namespace (string) – application namespace.
返回:

The current MigrationRunner instance

返回类型:

CodeIgniterDatabaseMigrationRunner

Sets the path the library should look for migration files:

$migration->setNamespace($path)
          ->latest();
setGroup($group)
参数:
  • $group (string) – database group name.
返回:

The current MigrationRunner instance

返回类型:

CodeIgniterDatabaseMigrationRunner

Sets the path the library should look for migration files:

$migration->setNamespace($path)
          ->latest();