插件数据库安装

应用插件的数据库统一使用 Phinx 脚本管理,基于 topthink/think-migration 组件实现。

目前主要支持:SqliteMySqlSqlServer 三种数据库,其他数据库未经测试,请自行研究并安装。

关于数据库脚本

数据库脚本文件由 版本号 + 脚本名称 组成, 每个脚本文件的 版本号脚本名称 都不能出现重复,否则重复的部分执行会报错。

每个脚本内是一个 think\migration\Migrator 的子类,主要实现里面的 change 方法,更多高级用法自行研究使用。

脚本安装信息会记录在数据表 migrations 中,如果需要清理并重复执行,需要删除这张表的数据。

命名规则: 脚本版本号通常由 8位年月日 + 6位数字组成,脚本名称可以取容易区别其功能的组合单词。

案例解析: 文件名 20221013045829_install_wechat.php 对应的版本号是 20221013045829,脚本名称为 install_wechat,其脚本内的 Class 类为 InstallWechat

生成数据库脚本

目前在核心组件 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: 邹景立