liquibase是一个用于数据库变更跟踪、版本管理和自动部署的开源工具。它的使用方式方法可以参考官方文档或者其他人的博客,这里不做过多介绍。

1. 问题复现

在使用过程中发现了一个版本bug。这个bug是这样的:

当我向用户表 ts_user 增加一个字段(比如身高: height )时,我在 ts_user.xml 中填入:

<changeSet id="ts_user_02" author="lunyu">
<addColumn tableName="ts_user">
<column name="height" type="decimal(4,1)" remarks="身高(单位厘米)" afterColumn="phone_no"/>
</addColumn>
</changeSet>

当我重启项目时,日志中就发现liquibase执行了相关语句。

liquibase.executor.jvm.JdbcExecutor   - ALTER TABLE mybatis_db.ts_user ADD height DECIMAL(4, 1) NULL COMMENT '身高(单位厘米)'  AFTER `phone_no`
liquibase.executor.jvm.JdbcExecutor - ALTER TABLE mybatis_db.ts_user COMMENT = '身高(单位厘米)'
liquibase.changelog.ChangeSet - Columns height(decimal(4,1)) added to ts_user
liquibase.changelog.ChangeSet - ChangeSet classpath:liquibase/changelog/sys/ts_user.xml::ts_user_02::lunyu ran successfully in 728ms

这时就发现在创建了新增了身高( height )这个字段后,liquibase莫名其妙地又给变更了一下用户( ts_user )表的注解(comment),于是我用数据库连接工具查看,用户表变成了这样:

CREATE TABLE `ts_user` (
`id` VARCHAR(32) NOT NULL COLLATE 'utf8_unicode_ci',
`login_name` VARCHAR(50) NULL DEFAULT NULL COMMENT '登录名' COLLATE 'utf8_unicode_ci',
`real_name` VARCHAR(50) NULL DEFAULT NULL COMMENT '真实姓名' COLLATE 'utf8_unicode_ci',
`ident_no` VARCHAR(18) NULL DEFAULT NULL COMMENT '身份证号' COLLATE 'utf8_unicode_ci',
`phone_no` VARCHAR(11) NULL DEFAULT NULL COMMENT '手机号' COLLATE 'utf8_unicode_ci',
`height` DECIMAL(4,1) NULL DEFAULT NULL COMMENT '身高(单位厘米)',
`version` INT(11) NOT NULL DEFAULT '0' COMMENT '版本',
`deleted` BIT(1) NOT NULL DEFAULT 'b\'0\'' COMMENT '是否删除',
`created_by` VARCHAR(32) NOT NULL DEFAULT '-1' COMMENT '创建人' COLLATE 'utf8_unicode_ci',
`created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_by` VARCHAR(32) NULL DEFAULT NULL COMMENT '更新人' COLLATE 'utf8_unicode_ci',
`updated_time` DATETIME NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
)
COMMENT='身高(单位厘米)'
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
;

很明显表注解这样的变更,影响了表的含义。

2. 问题解决

问题解决很简单,替换liquibase的版本。出问题的版本是3.8.9版本,把这个版本降低,使用3.6.3版本。不清楚高版本的liquibase为什么会出现这样的设计,至少我找了一圈没有找到可配置项用于消解这个问题。

使用3.6.3版本liquibase再次执行上面的步骤,执行效果如下,问题解决。

liquibase.executor.jvm.JdbcExecutor   - ALTER TABLE mybatis_db.ts_user ADD height DECIMAL(4, 1) NULL COMMENT '身高(单位厘米)'  AFTER `phone_no`
liquibase.changelog.ChangeSet - Columns height(decimal(4,1)) added to ts_user
liquibase.changelog.ChangeSet - ChangeSet classpath:liquibase/changelog/sys/ts_user.xml::ts_user_02::lunyu ran successfully in 1445ms

最新文章

  1. ASP.NET MVC5+EF6+EasyUI 后台管理系统(30)-本地化(多语言)
  2. json相关的一些用法
  3. TortoiseSVN文件夹及文件图标不显示解决方法
  4. phpstorm的安装、破解、和汉化
  5. java.util.concurrent Class ThreadPoolExecutor
  6. hdu4185解题报告
  7. Bezier曲线的原理 及 二次Bezier曲线的实现
  8. cocos2d_随手篇1_关于ccTouchBegan的调用
  9. Why your Games are Unfinished, and What To Do About It (转)
  10. 1002: [FJOI2007]轮状病毒
  11. Java排序算法之归并排序
  12. ASP.NET Core 运行原理解剖[1]:Hosting
  13. java ---日期的格式化
  14. 设计模式 --&gt; (17)状态模式
  15. IT企业级应⽤开发模式演化
  16. IDEA的Maxcomputer Studio开发
  17. 2190: [SDOI2008]仪仗队
  18. Sqlite文件在ubunut的查看
  19. Docker概念学习系列之Docker的主要目标(2)
  20. Vue---父子组件之间的通信

热门文章

  1. NCB | 定量蛋白质组学揭示细胞外泌体通用标志物Syntenin-1
  2. docker容器存储
  3. [论文阅读] LCC-NLM(局部颜色校正, 非线性mask)
  4. WPF MVVM模式下路由事件
  5. MyBatis学习01(初识MyBatis和CRUD操作实现)
  6. springboot打包问题
  7. Java的安装过程和开发环境
  8. SQL Server 判断数据库中是否存在表
  9. mysql自带分区(不修改源码)
  10. [SWMM]弗汝德数