1

我正在寻找想法来正确处理跨环境的项目的 mysql 表更新。我看过这CI DB Forge门课,我相信这可能会对我有所帮助。我的想法是:

  1. 为每个数据库安装、表升级或更改创建一个新文件。该文件将包含执行每个相关任务的原始 mysql 查询
  2. 在加载任何控制器之前通过钩子运行升级脚本
  3. 继续加载项目

这是正确的想法吗?这与 Magento 处理每个扩展的数据库升级的方式非常相似。

4

1 回答 1

6

听起来您正在寻找Migrations 课程。这是一个相当新的库,我认为目前的文档不太好。

如果您启用此库application/config/migrations.php并加载它,它将创建一个名为migrations. 那里的工作流程如下:

  1. application/migrations确保您使用按顺序编号的文件名(如001_some_descriptive_name.php. 格式很重要,正好是 3 个数字,并且在它们之后至少有一个_
  2. 在新文件中创建一个以文件名命名的类,因此001_some_descriptive_name.php应该保存一个名为Migration_Some_descriptive_name并扩展该类的CI_Migration类。类名大小写很重要,首先是一个大写Migration_字母,然后是小写。
  3. 在类中创建公共up和公共down方法
  4. 在 up 方法中添加您的迁移代码,这会更改数据库。您可以使用 db forge 库或只是普通的旧$this->db->query()调用。如果您需要支持多个数据库系统,那么 Dbforge 更便携,使用它可能会更好。
  5. down方法内添加将反转up. 如果up添加列,down则应删除该列,如果up创建表,down则应删除该表,依此类推。
  6. 完成迁移课程后,请migration_version在迁移配置文件中进行碰撞。
  7. 创建一个控制器加载迁移库并调用$this->migration->current()它将检查migration数据库表中的版本并运行迁移类updown方法,以达到您在步骤 6 中设置的配置文件中的迁移版本。例如,如果数据库说您是版本 2,并且配置说你应该在 5,然后它将按顺序运行带有, ,文件名up的迁移方法。如果您设置较低的数字,则将调用当前的方法。数据库从 0 开始计数,所以不要创建文件。003_...004_...005_..down000_...

如果您喜欢冒险,您可以创建一个加载迁移类并get_instance()->migration->latest()在每个页面加载时运行的钩子,这样一旦您部署新的迁移类,每个环境都会自动更新数据库。

于 2013-03-26T20:46:46.557 回答