版本化的数据库迁移

需要比仅仅通过 CakePHP 的迁移 shell 更新数据库模式更多的控制?好吧,这是一个快速解决数据库版本控制问题的方案!并且它是一个很棒的工具,可以让您 CakePHP 项目上的所有开发人员保持他们各自的数据库更新。您可以选择自动执行此操作,也可以使用插件的 GUI 在版本之间随意切换。最棒的是,它充分利用了 CakePHP 的“模型”层,因此您在版本之间跳跃时几乎可以做任何事情。

CakePHP:用于 CakePHP 2.0 的版本化的数据库迁移插件

安装

按照以下简单步骤安装此插件

  1. 将此插件复制到 app/Plugin 目录下的名为“DbMigrations”的目录中。
  2. 现在,通过粘贴以下行在您的应用程序的引导文件中加载插件(典型位置:app/Config/bootstrap.php)
CakePlugin::load('DbMigrations');
  1. 之后,查看 DbMigrations/Config/config.php。在这里您会找到两个设置
table => 'db_migrations'
and sanityCheck => true

These settings are as simple as they sound. The "table" is the name of the table the DbMigrations plugin is going to use.
You can change it to your liking.
The second setting: "sanityCheck", when turned to "TRUE" lets DbMigrations check if the table specified in the "table"
property exists. If not, it simply creates it so that you won't have to do a thing :)
  1. 按照上述步骤操作后,您可以通过两种方式使您的数据库保持最新。
4.1. You can simply paste this line "ClassRegistry::init('DbMigrations.Migration')->upgrade(true)" in your AppController::beforeFilter().
     Following this way, whenever your you hit a page, the AppController::beforeFilter() will be executed, hence, the DbMigrations plugin
     will update your database to the latest version if it's not already.

4.2. OR you can go to the plugin's GUI, http://your_website_url/db_migrations/migrations and choose the revision you'd like
     your database to be updgraded or downgraded to.

注意:我不建议同时使用 4.1 或 4.2。

您就完成了! - 此外,我建议始终将这种自动升级用于测试和开发等环境。在生产环境中使用它可不是什么好习惯。最适合开发环境。

它是如何工作的 B0x1A6 所以,在您完成安装步骤后,在您的“app”目录中创建一个名为“Migrations”的文件夹。您会在“DbMigrations”目录中找到一个名为“Migrations”的文件夹。这是默认文件夹。最好将文件整理到 app 目录中的文件夹中,以便更好地组织。(在未来的版本中,我可以将该文件夹名称和路径配置为可配置的)。

“Migrations”文件夹中的示例文件列表如下

001_initial_db_dump.php
002_users_table_add_deleted_field.php
003_create_samples_table.php
004_changes_for_issue_336.php

您创建的文件分为两部分。如您所见,文件名称以版本号为前缀。这些版本号需要是唯一的,因为它将是数据库的增量更新。

现在来看看一个示例文件的内容。例如,对于第二个文件“002_users_table_add_deleted_field.php”,其内容将很简单

class DbMigration_2 extends DbMigrationsAppModel {

    public function up() {
        $sql = "ALTER TABLE  `users` ADD  `deleted` TINYINT( 1 ) NOT NULL";
        $this->query($sql);
    }

    public function down() {
        $sql = "ALTER TABLE `users` DROP `deleted`";
        $this->query($sql);
    }
}

在进行所有更改(按照安装步骤操作)并创建这些文件后,如果您按照步骤 4.1 更新您的数据库,那么当您第一次运行应用程序时,它将运行所有这些文件,从而将所有更改推送到您的数据库中。

如果您注意到,您将看到所有“DbMigration_{$revisionNumber}”类都是 CakePHP 模型的实例。因此,您可以充分利用 CakePHP 的模型层!

如果在任何时候,假设您需要将您的更改降级到特定的修订号,在本例中为 2。您只需要在代码中的任何合适位置执行此语句

ClassRegistry::init('DbMigrations.Migration')->downgrade(2);

这将回滚到修订号 2 之前的所有更改。这意味着它将删除“samples”表(您应该在 DbMigration_3 类的 downgrade() 函数中编写删除语句)。

如果您希望再次使您的数据库更新到最新版本,那么只需发出 upgrade() 语句,它将重新创建“samples”表并推送所有针对问题 336 的更改。它不会执行文件 001 和 002 的更改。

或者,您可以按照步骤 4.2 操作。

重要说明

您需要小心地命名您的 DbMigration_X 类,“X”应该对应于每个迁移文件前面添加的修订号。

目前没有实现任何检查。如果您搞砸了,不会抛出异常。因此,您确实需要仔细编写 DbMigration_X 类的 up() 和 down() 函数。

您甚至可以向表中插入数据并发出更新语句。

希望此插件能让您的生活更轻松,让开发更快!

在 我的 GitHub 个人资料中找到此插件:https://github.com/SayB/DbMigrations