ulthon_admin
欢迎 目录和文件规范 系统架构 命名规范 php-cs-fixer public/static目录规范 app/common目录规范 数据库规范 CURD 命令行 表结构 数据库迁移代码 最佳实践 数据库自动缓存 后台菜单导入导出 权限的用法 table数据表格 cols operat _if titleField field selectList valueParser trueHide fieldFormat templet defaultValue search相关 time defaultSearchValue defaultToolbar init formFullScreen toobar modifyReload 控制器 CURD方法 导出 控制器通用验证 dataBrage向js传递参数 组件控件 select 下拉菜单option拼接 lay-submit paste-text粘贴 multiple-columns editor data-upload上传 tag-input标签输入 property-input动态字段输入 data-date时间控件参数 table-data列表选择器 city-picker城市选择器 copy-text 全局监听组件 data-request data-open 内置定时器 并发模式 重置密码 系统配置 PHP助手函数 sysconfig JS助手函数 checkMobile empty open 弹框 叠加loading getDataBrage getQueryVariable 扩展机制 事件扩展 实现事件 执行事件 事件列表 AdminLayoutRequireAfter LoadMigrationFiles AdminLoginIndex AdminLoginForget AdminLoginType AdminMenuTab AdminLayoutRequireBefore 自动更新 性能优化 精简代码 关闭数据库日志驱动 皮肤 正常 科幻 其他 切换模块时直接切换内容 关闭上传文件注入检测 代码编译原理 接入workerman和命令参数 升级TP6.1 Request的默认过滤 异步引入全局script 线上安装脚本 兼容PHP8.1

用法

什么是数据库迁移工具

ulthon_admin标准的安装流程是使用数据库迁移工具进行安装,他不仅可以安装到mysql数据库,也支持sqlitesqlserver等其它数据库。

具体用法参考文档:

https://www.kancloud.cn/manual/thinkphp6_0/1118028

但一般而言,我们开发中不会从写迁移代码开始,而是直接使用顺手的数据库工具(Dbeaver、Navcat等)设计数据库,然后在开发中修修补补。

这并没有什么不妥,但是如果你做的是一个标准产品,需要经常执行安装和更新,需要给多个客户部署时,就会感到吃力。

遇到这种情况,你只能从一个数据库导出,再导入到另一个数据库,反反复复的操作。还有可能不知道哪个是最新的,哪个需要更新,哪个更新到哪个版本了。

另一方面,如果数据库丢失了,而你手里又没有及时备份,那么也是很头疼的事。

数据库迁移工具就是为了解决以上种种问题的,比如我们需要新建一张test_goods数据表,我们可以使用数据库迁移工具,写出这样的代码:

  1. <?php
  2. use think\migration\Migrator;
  3. use think\migration\db\Column;
  4. class TestGoods extends Migrator
  5. {
  6. public function change()
  7. {
  8. $table = $this->table('test_goods')
  9. ->setComment('商品列表')
  10. ->addColumn('cate_id', 'biginteger', ['limit' => '20', 'signed' => '0', 'null' => '0', 'default' => '0', 'comment' => '分类ID {relation} (table:mall_cate,relationBindSelect:title)',])
  11. ->addColumn('title', 'char', ['limit' => '20', 'null' => '0', 'default' => '', 'comment' => '商品名称',])
  12. .......
  13. ->addColumn('detail', 'text', ['null' => '1', 'comment' => '详情',])
  14. ->addIndex('uid', ['unique' => true])
  15. ->addIndex('detail', ['type' => 'fulltext'])
  16. ->addIndex('cate_id')
  17. ->create();
  18. }
  19. }

然后运行命令:

  1. php think migrate:run

此时这张表就出现在我们的数据库了,至于其他的表,并不会覆盖或丢失。

这样有很多好处:

  • 数据库跟随版本库存储不会丢失
  • 没有反复多余的导出数据库
  • 可以安装到“任何数据库”
  • 任何标准产品都可以任意运行该命令用于升级数据库

但是我们开发的时候,不会直接写数据迁移工具,而是从设计表开始。如果我们需要数据库迁移工具,就只能照着现在的数据表写迁移工具,这是以前的做法,也只能这样做。但是现在不一样了,通过一行命令可以一键生成数据库迁移的代码。就像生成curd那样。

现在按照我们的介绍看看怎么用吧。

使用

我们先用自己喜欢的方式设计出一张表。

  1. -- admin_demo_ultho.ul_test_goods definition
  2. CREATE TABLE `ul_test_goods` (
  3. `id` int(11) NOT NULL AUTO_INCREMENT,
  4. `cate_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '分类ID {relation} (table:mall_cate,relationBindSelect:title)',
  5. `title` char(20) NOT NULL DEFAULT '' COMMENT '商品名称',
  6. `logo` char(255) NOT NULL COMMENT '商品logo {image}',
  7. `images` text NOT NULL COMMENT '商品图片 {images}',
  8. `describe` text NOT NULL COMMENT '商品描述 {editor}',
  9. `total_stock` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '总库存',
  10. `sort` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '排序',
  11. `status` int(1) unsigned NOT NULL DEFAULT '0' COMMENT '状态 {radio} (0:正常,1:禁用)',
  12. `cert_file` varchar(100) NOT NULL COMMENT '合格证 {file}',
  13. `verfiy_file` text NOT NULL COMMENT '检测报告 {files}',
  14. `remark` char(255) NOT NULL DEFAULT '' COMMENT '备注说明',
  15. `create_time` int(11) unsigned NOT NULL DEFAULT '0',
  16. `update_time` int(11) unsigned NOT NULL DEFAULT '0',
  17. `delete_time` int(11) unsigned NOT NULL DEFAULT '0',
  18. `publish_time` int(10) unsigned NOT NULL COMMENT '发布日期 {date} (date)',
  19. `sale_time` bigint(20) unsigned NOT NULL COMMENT '售卖日期 {date} (datetime)',
  20. `intro` varchar(100) NOT NULL COMMENT '简介 {textarea}',
  21. `time_status` smallint(5) unsigned NOT NULL COMMENT '秒杀状态 {select} (0:未参加,1:已开始,3:已结束)',
  22. `is_recommend` tinyint(4) NOT NULL COMMENT '是否推荐 {switch} (0:不推荐,1:推荐)',
  23. `shop_type` varchar(100) NOT NULL COMMENT '商品类型 {checkbox} (taobao:淘宝,jd:京东)',
  24. `tag` varchar(100) NOT NULL COMMENT '商品标签 {table} (table:mall_tag,type:checkbox,valueField:id,fieldName:title)',
  25. `tag_backup` varchar(100) DEFAULT NULL COMMENT '商品标签(单选) {table} (table:mall_tag,type:radio,valueField:id,fieldName:title)',
  26. `from_area` varchar(100) NOT NULL COMMENT '产地 {city} (name-province:0,code:0)',
  27. `store_city` varchar(100) NOT NULL DEFAULT '山东省/临沂市' COMMENT '仓库 {city} (level:city)',
  28. `tag_input` varchar(100) NOT NULL COMMENT '商品标签 (输入) {tag}',
  29. `uid` varchar(100) NOT NULL COMMENT '唯一id',
  30. `price` decimal(10,2) DEFAULT NULL COMMENT '价格',
  31. `detail` longtext COMMENT '详情',
  32. PRIMARY KEY (`id`),
  33. UNIQUE KEY `ul_test_goods_uid_IDX` (`uid`) USING BTREE,
  34. KEY `cate_id` (`cate_id`) USING BTREE,
  35. FULLTEXT KEY `ul_test_goods_detail_IDX` (`detail`)
  36. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='商品列表';

面对这样一张数据表,如果我们要对照写出数据库迁移工具的代码,会很费事,而且很容易就写错了。

但现在时代变了,只需要一行命令

  1. php think curd:migrate -t test_goods

此时会在数据库迁移工具的工作目录下生成一个文件:

  1. database\migrations\20220905222557_test_goods.php

这跟使用官方的生成方式一致

此时会直接生成开头那样的数据库迁移代码。

结尾

可能你没用过数据库迁移工具,那么目前可能无法引起你的兴趣,(建议使用),如果你正在使用,那么这个命令绝对能给你带来极大的便利。甚至可以让那些拥有几十个数据表的项目,也能轻松地使用数据库迁移工具来安装了。

ulthon_admin正在积极维护,拥有极高的定制性,支持依赖裁剪,精简代码,欢迎使用。

原文标题:数据库迁移代码

原文文档:ulthon_admin

原文地址:https://doc.ulthon.com/read/augushong/ulthon_admin/6316125e05bf7/zh-cn/2.x.html

原文平台:奥宏文档

2.x