首页 >后端开发 >php教程 >带有梯子迁移的数据库版本控制

带有梯子迁移的数据库版本控制

Jennifer Aniston
Jennifer Aniston原创
2025-02-21 10:30:09815浏览

Database Versioning with Ladder Migrations

核心要点

  • Ladder 是一款用于创建、运行和管理数据库迁移的工具,它允许以与应用程序代码相同的方式跟踪数据库模式的更改。此工具可以集成到任何主要框架中,并可用于版本控制中的更改和功能管理。
  • 迁移始终按顺序运行,Ladder 通过按顺序编号迁移并在数据库本身中存储已运行迁移的记录来确保这一点,从而防止重新运行以前的迁移。
  • Ladder 还允许预填充或“播种”数据库,从而能够创建默认数据集,例如默认用户帐户。这可以使用 Ladder 的键值存储来完成,将某些数据存储起来以便以后参考。
  • 该工具提供其他命令来管理和监控数据库,例如用于数据库状态的 status 命令、用于转储和恢复数据库状态的 diff 和 diff-save 命令,以及用于检查所用 Ladder 版本的 version 命令。

版本控制系统对于跟踪代码中的更改非常宝贵,尤其是在团队合作时。但是,大多数应用程序不仅仅包含应用程序代码。管理数据库的更改一直更具挑战性,尤其是在添加需要更改模式的新功能时。

假设您正在处理一个模块,并且意识到一个数据库表需要一个额外的列。您可能会想打开一个数据库查询工具或命令行,然后简单地添加该列。但是,这不会像版本控制的应用程序代码那样留下更改记录。在团队合作时,这种情况会加剧——如果同事在没有运行相同的数据库更新的情况下提取您的代码更改,那么他们的应用程序版本很可能会崩溃。当您发布产品更新时,这会变得更加成问题,因为这可能会破坏不仅仅是您同事的应用程序,还会破坏您的用户的应用程序。

一种解决方案是使用迁移将创建和修改数据库模式的责任转移到代码中。这样,就可以与应用程序的其余部分一起管理更改,并且我们可以利用版本控制中我们习以为常的功能(例如能够比较版本并保留审计跟踪)来处理数据库更改。它还允许这些更改无缝地集成到版本中,因为它们可以成为同一分支或标签的一部分。

许多主要框架都有自己的迁移实现,但对于那些没有的框架——如果您没有使用任何框架——可以使用 Ladder。

Ladder 简介

Ladder 是一款用于创建、运行和管理数据库迁移的工具。迁移只是一个 PHP 类,因此可以与应用程序的其余代码一起签入版本控制。

您可以在单个迁移中对模式进行任意多的更改,尽管最好将迁移限制为单个表或功能。

迁移始终按顺序运行。因此,假设您编写一个用于创建 products 表的迁移,并且几周后创建一个新的迁移来向其中添加一个额外的列。尝试在后者之前运行前者将产生错误。Ladder 通过按顺序编号迁移以及在数据库本身中存储已运行迁移的记录(以及时间)来解决此问题。

安装

Ladder 可以从 Bitbucket 或通过 Composer 下载。但是,需要几个步骤才能启动并运行。

最简单的方法(尽管承认不那么优雅)是从下载或克隆它,并将其放在项目根目录中名为 ladder 的目录中。使用 Composer 的问题是运行 composer update 将覆盖您的配置文件。

有五个配置文件,每个配置文件都需要手动创建;最简单的方法是复制提供的示例:

<code class="language-bash">cp ladder/config/config.php.example ladder/config/config.php
cp ladder/config/database.php.example ladder/config/database.php
cp ladder/config/diff.php.example ladder/config/diff.php
cp ladder/config/editor.php.example ladder/config/editor.php
cp ladder/config/table.php.example ladder/config/table.php</code>

您可能只需要修改 database.php(其中包含数据库连接详细信息)和 editor.php,您可以在其中指定首选文本编辑器,以及选择在创建时自动打开新的迁移。

创建迁移

让我们从创建一个迁移来创建 users 表开始。

在命令行上:

<code class="language-bash">php ladder/ladder.php create create_users_table</code>

这将创建一个名为 ladder/migrations/00001_create_users_table 的文件,默认情况下,该文件包含一个带有注释掉的示例调用的基本结构。如果您已在 ladder/config/editor.php 中将 auto-edit 设置为 true,则此文件将立即在指定的文本编辑器中打开。您可以随意调用迁移,但能够一目了然地从文件名中看到迁移的作用会有所帮助。

以下是该文件可能的样子(为了清晰起见,我删除了已注释掉的代码行):

<code class="language-php">class Create_Users_Table_Migration_00001 extends Migration {
    protected $min_version = '0.8.1';

    public function up() {
        $this->create_table('users')
            ->column('email', 'varchar', array('limit' => 128, 'null' => FALSE))
            ->column('password', 'varchar', array('limit' => 32, 'null' => FALSE));
    }

    public function down() {
        $this->table('users')->drop();
    }   
}</code>

当运行迁移时调用 up() 方法,当回滚迁移时调用 down() 方法——因此它始终需要执行与 up() 方法相反的操作。在此示例中,up() 方法创建一个名为 users 的表,而 down() 方法将其删除。

create_table() 方法返回对新表的引用,而 Table 类具有一个 column() 方法来添加新列。它具有流畅的接口,因此您可以将它们链接在一起以同时创建多个列。您会注意到没有 ID 列——这是自动创建的——即名为 id 的自动递增整数主键。

table() 返回对表的引用,但如果表尚不存在,它也会创建表——因此,您可以安全地将 create_table() 调用更改为 table()

让我们创建另一个迁移,这次是创建 roles 表:

<code class="language-bash">php ladder/ladder.php create create_roles_table</code>

文件本身:

<code class="language-php">class Create_Roles_Table_Migration_00002 extends Migration {
    protected $min_version = '0.8.1';

    public function up() {
        $this->table('roles')
            ->column('nme', 'varchar', array('limit' => 128, 'null' => FALSE));            
    }

    public function down() {
        $this->table('roles')->drop();
    }   
}</code>

现在您需要实际运行迁移。为此:

<code class="language-bash">php ladder/ladder.php migrate</code>

如果您查看数据库,您会发现四个表:

migrations 是自动创建的,用于跟踪已运行哪些迁移 migrations_kvdata 也是为您创建的,您的迁移可以使用它进行任意键值存储 users 和 roles 是我们刚刚添加的表。

但是,如果您仔细注意 roles 迁移,您会注意到它创建了一个名为 nme 而不是 name 的列。此时,我们可以通过“撤消”迁移、修改类然后再次运行它来修复此问题。要回滚迁移:

<code class="language-bash">cp ladder/config/config.php.example ladder/config/config.php
cp ladder/config/database.php.example ladder/config/database.php
cp ladder/config/diff.php.example ladder/config/diff.php
cp ladder/config/editor.php.example ladder/config/editor.php
cp ladder/config/table.php.example ladder/config/table.php</code>

数字 2 表示要回滚到的迁移——它是迁移文件名的前缀,没有前导零。

现在您可以简单地进行更正,然后再次运行迁移:

<code class="language-bash">php ladder/ladder.php create create_users_table</code>

因为 migrations 表已存储运行和未运行内容的记录,所以您无需担心您的第一次迁移将被重新运行。

还有一种更快的方法,可以使用 reapply:

<code class="language-php">class Create_Users_Table_Migration_00001 extends Migration {
    protected $min_version = '0.8.1';

    public function up() {
        $this->create_table('users')
            ->column('email', 'varchar', array('limit' => 128, 'null' => FALSE))
            ->column('password', 'varchar', array('limit' => 32, 'null' => FALSE));
    }

    public function down() {
        $this->table('users')->drop();
    }   
}</code>

这将一次性调用第二个迁移的 down() 方法,然后调用其 up() 方法。

现在假设一段时间后,我们开发了一个新功能,该功能要求 users 表包含一个 status 字段。为此,我们需要创建一个新的迁移:

<code class="language-bash">php ladder/ladder.php create create_roles_table</code>

迁移将如下所示:

<code class="language-php">class Create_Roles_Table_Migration_00002 extends Migration {
    protected $min_version = '0.8.1';

    public function up() {
        $this->table('roles')
            ->column('nme', 'varchar', array('limit' => 128, 'null' => FALSE));            
    }

    public function down() {
        $this->table('roles')->drop();
    }   
}</code>

和以前一样,使用以下命令运行:

<code class="language-bash">php ladder/ladder.php migrate</code>

现在,如果您检查您的数据库,您会看到 users 表有一个新列。

数据库播种

除了编写迁移来管理数据库模式外,您还可以使用 Ladder 来预填充(即播种)数据库。

例如,您可以扩展 create_users_table 迁移以创建默认的 root 用户帐户:

<code class="language-bash">php ladder/ladder.php remove 2</code>

请注意,我们正在使用 set() 和 get() 方法来利用 Ladder 的键值存储,存储用户 ID 以便我们以后可以引用它。

您还可以从迁移中的 CSV 文件导入数据,例如:

<code class="language-bash">php ladder/ladder.php migrate</code>

要更新而不是插入 CSV 数据,您可以这样做:

<code class="language-bash">php ladder/ladder.php reapply 2</code>

在这种情况下,send 参数表示我们要运行 UPDATE,第三个参数包含用于确定要更新哪些记录的关键字段列表。

添加其他数据库

您会注意到默认数据库配置文件 ladder/config/database.php 演示了如何添加其他数据库连接;也许用于登台或实时数据库。例如:

<code class="language-bash">php ladder/ladder.php create add_status_to_users_table</code>

您可以像这样指定要使用的连接:

<code class="language-php">class Add_Status_To_Users_Table_Migration_00003 extends Migration {
    protected $min_version = '0.8.1';

    public function up() {
        $this->table('users')
            ->column('status', 'integer', array('null' => FALSE, 'default' => 0));            
    }

    public function down() {
        $this->table('users')->drop_column('status');      
    }
}</code>

其他命令

状态

您可以使用 status 命令获取数据库的状态:

<code class="language-bash">php ladder/ladder.php migrate</code>

示例输出:(此处省略示例输出,因为原文档中没有提供具体的输出内容)

diff 和 diff-save

(此处省略 diff 和 diff-save 命令的描述,因为原文档中已经详细描述了这些命令)

版本

(此处省略 version 命令的描述,因为原文档中已经详细描述了该命令)

总结

本文介绍了 Ladder,用于维护数据库模式和预填充数据。(此处省略总结部分,因为原文档已经对Ladder进行了总结)

数据库版本控制和 Ladder 迁移的常见问题

(此处省略常见问题解答部分,因为原文档已经提供了详细的常见问题解答)

以上是带有梯子迁移的数据库版本控制的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn