【问题标题】:codeigniter project database upgrade scriptscodeigniter 项目数据库升级脚本
【发布时间】:2013-03-26 20:08:03
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您有足够的纪律性来为每次更改写出 SQL,那就太好了。但是,如果您有多个环境(超过 2 个),那么即使这样也可能还不够。我最近一直在使用 mysql workbench db 比较工具来迁移数据库更改;它运作良好。
  • 我正在使用开发、测试和生产环境。数据库更改本质上很简单,我目前只通过 Navicat 复制/粘贴来处理它们。我只是在寻找一种更专业的方法来处理它。工作台工具是否真的会生成 sql 查询来修补升级?
  • 我刚刚了解到 Navicat 在我拥有的版本中内置了数据和结构比较和同步工具,这很棒,但我仍然喜欢编程解决方案。
  • 还有一个 mysql 命令行实用程序来区分数据库并生成 SQL 以合并它们:dev.mysql.com/doc/workbench/en/mysqldbcompare.html 我不认为在生产服务器上自动运行 sql 更改是安全的 - 某些结构变化可能会破坏您的网站;最好手动查看您将要应用的更改。

标签: php database codeigniter


【解决方案1】:

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

如果您在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,那么它将运行带有 003_...004_... 的迁移的 up 方法, 005_.. 文件名按顺序排列。如果您设置较低的数字,则将调用当前的 down 方法。数据库从 0 开始计数,因此不要创建 000_... 文件。

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

【讨论】:

  • 是的,这正是我所需要的!不知道我是怎么错过的,但我会试一试。感谢您提供非常详细和有用的文章...您自己在任何项目中使用过这个吗?
  • Migration_Some_descriptive_name 是正确的类名吗?它不包含数字。在文件中最重要的部分...
  • @Rudie,是的,类名前面不需要数字,只需要文件名(这是为了排序)。以数字开头的类、函数甚至变量名都是解析错误。
  • 我现在在我的项目中实现这个。非常感谢您的建议。
  • 只是想跟进此事。我刚刚成功地将所有升级脚本添加到我的项目中,并使用post_controller_constructor 挂钩运行它们。现在我只需要记住忠实地添加我的脚本:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-18
  • 2023-03-05
  • 1970-01-01
相关资源
最近更新 更多