插件数据库安装

为了提升应用插件数据库管理的规范性和兼容性,统一采用 Phinx 脚本进行数据库的管理。Phinx 是一个轻量级的 PHP 数据库迁移工具,它允许开发者通过编写迁移脚本来管理数据库的结构变更,从而确保数据库的版本控制和升级过程的自动化。

系统基于 topthink/think-migration 组件实现了 Phinx 脚本的集成。该组件是专门为 ThinkPHP 框架设计的迁移工具,能够与 ThinkPHP 的插件机制无缝对接,为插件开发者提供了一套完整且易用的数据库迁移解决方案。

目前,系统的数据库管理方案主要支持 SqliteMySqlSqlServer 这三种常用的数据库类型。对于其他数据库,虽然目前未经测试,但我们鼓励开发者自行研究并安装相应的驱动和配置,以充分利用 Phinx 脚本的迁移功能。

通过统一使用 Phinx 脚本进行数据库管理,实现以下目标:

  • 简化数据库迁移过程,减少手动修改数据库结构的繁琐操作。
  • 提高数据库结构的版本控制能力,确保每次插件升级时数据库结构的一致性。
  • 增强数据库的兼容性和可移植性,使得插件能够更轻松地适应不同的数据库环境。

通过这一优化措施,应用插件的数据库管理将变得更加规范、高效和可靠,为插件开发者提供更好的支持和体验。

关于数据库脚本

为了确保数据库脚本文件管理的规范性和准确性,对数据库脚本的命名规则、结构以及执行机制进行了进一步的优化。

管理规范明确规定了数据库脚本文件的命名规则。每个脚本文件都由版本号和脚本名称两部分组成,确保每个脚本文件具有唯一的标识。版本号采用8位年月日加6位数字的组合形式,确保版本号的唯一性和可排序性。脚本名称则取容易区别其功能的组合单词,以便于理解和维护。

每个脚本文件都是一个继承自 think\migration\Migrator 的子类,主要实现其中的 change 方法。change 方法是脚本的核心部分,包含了数据库结构的变更逻辑。开发者可以根据需要自定义该方法,以实现各种复杂的数据库迁移操作。同时也提供了更多高级用法的文档和示例,供开发者自行研究和使用。

脚本的安装信息会记录在数据表 migrations 中,以便于跟踪和管理脚本的执行情况。如果需要清理并重复执行脚本,开发者只需删除该表中的数据即可。这种机制保证了脚本的重复执行不会出现问题,同时也方便了开发者进行数据库结构的调整和测试。

通过一个具体的案例来解析命名规则的实际应用。例如,文件名 20221013045829_install_wechat.php 对应的版本号是 20221013045829,脚本名称为 install_wechat 。根据命名规则,该脚本内的类名应为 InstallWechat ,类名首字母大写,与脚本名称保持一致,符合PHP的命名规范。

生成数据库脚本

目前在核心组件 ThinkLibrary 内集成了 php think xadmin:package 指令,可以将现有 MySQL 数据库打包为数据库脚本,打包好的文件存入在 database/migrations 目录。 打包好后的文件可能还需要后期修改,注意不能出现版本号重复和类名重复,如果出现重复需要将重复的历史数据删除或者修改文件名称。

数据库脚本里面需要做好执行前置检查逻辑,要保证同一个脚本可以重复多次运行,不会导致系统出现问题,系统不能保证同一个脚本只会执行一次,有可能是人为原因。

系统也可以通过这个指令进行数据库备份,支持数据结构与指定数据表内容备份,数据库备份配置文件见项目的 config/phinx.php 文件,主要有三个参数,描述如下:

  • 参数 backup 数组,表示要备份内容的数据表名,不填写就是不备份内容;
  • 参数 tables 数组,表示要备份结构的数据表名,不填写就是备份全部表;
  • 参数 ignore 数组,表示要忽略备份结构的数据表名,不填写就是备份全部表;

经验教训: 以往我们做过很多的项目,经常忘记将数据库打包备份落地到项目仓库,项目交付经过一段时间停止运维后,线上数据库和本地开发数据库可能都已经丢失,只剩下仓库里面的项目代码,此时这个项目就失去了重复利用的价值,没有数据库项目是跑不起来的,因此我们开发项目的时候需要经常备份数据库结构并与项目保存到一起。

备份所有数据: 可以通过 php think xadmin:package --all 备份所有数据 ( 数据库表结构和数据记录 ),为了维持项目不无限增大,备份记录只保存一份。将此备份脚本上传到对应项目,执行 php think migrate:run 即可完成数据恢复 ( 只有空数据库才会执行恢复 )。

操作演示截图

封装插件数据库

将上面生成的数据库脚本文件复制到插件目录,建议不要与源码 src 放到一个目录,防止 Composerautoload 扫描到而导致加载规则污染。 安装应用插件时通过 插件安装器 将应用插件的数据库脚本复制到 database/migrations 目录,执行 php think migrate:run 完成数据库安装与更新。

Last Updated:
Contributors: 邹景立