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

liquibase新增字段注释导致表格注释同时变更bug记录的更多相关文章

  1. sql新增字段注意事项

    新增字段的类型.长度(精度)是否合适 解决方法: 跟应用明确加字段和改字段的风险,确认新增字段类型正确.长度(精度)合适. 以及跟应用明确老数据是否要订正?如何订正?新增列是否非空?是否有默认值等等. ...

  2. Hive分区表新增字段及修改表名,列名,列注释,表注释,增加列,调整列顺序,属性名等操作

    一.Hive分区表新增字段 参考博客:https://blog.csdn.net/yeweiouyang/article/details/44851459 二.Hive修改表名,列名,列注释,表注释, ...

  3. PowerDesigner 如何添加每个表中共用的字段及自动添加注释

    PowerDesigner 如何添加每个表中共用的字段: 有时候在创建表的时候会有一些共用的字段,但是每一张表都要去创建,这样做很麻烦,特别是这样重复的工作,稍不留意就会出现问题,实际上在PD中有这样 ...

  4. ORACLE数据库导出表,字段名,长度,类型,字段注释,表注释语句

    转自:https://www.cnblogs.com/superming/p/11040455.html --数据库导出表,字段名,长度,类型,字段注释,表注释语句 SELECT T1.TABLE_N ...

  5. NX二次开发-读取图纸表格注释与部件属性关联的名字

    NX11+VS2013 #include <uf.h> #include <uf_ui.h> #include <uf_tabnot.h> #include < ...

  6. NX二次开发-UFUN读取表格注释内容UF_TABNOT_ask_cell_text

    NX11+VS2013 #include <uf.h> #include <uf_ui.h> #include <uf_tabnot.h> #include < ...

  7. NX二次开发-UFUN工程图表格注释section转tag函数UF_TABNOT_ask_tabular_note_of_section

    NX9+VS2012 #include <uf.h> #include <uf_tabnot.h> #include <NXOpen/Part.hxx> #incl ...

  8. NX二次开发-UFUN工程图表格注释获取某一行的tag函数UF_TABNOT_ask_nth_row

    NX9+VS2012 #include <uf.h> #include <uf_tabnot.h> #include <NXOpen/Part.hxx> #incl ...

  9. NX二次开发-UFUN工程图表格注释获取某一列的tag函数UF_TABNOT_ask_nth_column

    NX9+VS2012 #include <uf.h> #include <uf_tabnot.h> #include <NXOpen/Part.hxx> #incl ...

随机推荐

  1. JVM 常用监控工具

    概述 给一个系统定位问题的时候,知识.经验是关键基础,数据是依据,工具是运用知识处理数据的手段. 这里说的数据包括但不限于异常堆栈.虚拟机运行日志.垃圾收集器日志.线程快照(threaddump/ja ...

  2. OEM 刷新配置方法

    一:设置>添加目标>配置自动搜索 二:主机上的目标>针对所选的主机 三:禁用调度 四:设置>添加目标>自动搜索结果 五:主机上的目标,搜索结果 六:删除 七:选择机器数据 ...

  3. 绿色djvu阅读软件

    官方的djvu viewer都需要安装,总算找到一个绿色版的,名为STDU Viewer,可以阅读的格式包括DjVu, PDF, TIFF, XPS, FB2等,版本为1.6.2.

  4. [.NET大牛之路 007] 详解 .NET 程序集

    .NET大牛之路 • 王亮@精致码农 • 2021.07.13 上一篇我们介绍了 Roslyn 编译器,我们知道,我们编写的 C#/VB 代码经过 Roslyn 编译器编译后会生成程序集文件.按照之前 ...

  5. MySQL-11-存储引擎

    存储引擎简单介绍 存储引擎:相当于Linux文件系统,只不过比文件系统强大 功能 数据读写 数据安全和一致性 提高性能 热备份 自动故障恢复 高可用方面支持 存储引擎种类 InnoDB MyISAM ...

  6. DAY04 与用户交 互格式化输出与运算符

    与用户交互 输入: input # python2与python3的区别 # python3 res = input('please in put your username>>>& ...

  7. NOIP 模拟 $36\; \rm Dove 打扑克$

    题解 \(by\;zj\varphi\) 引理 对于一个和为 \(n\) 的数列,不同的数的个数最多为 \(\sqrt n\) 证明: 一个有 \(n\) 个不同的数的数列,和最小就是 \(n\) 的 ...

  8. DOS创建/删除/描述 windows服务

    1.以管理员运行cmd ,输入 sc create test binPath= 程序路径\xxx.exe,主要 "="后面必须要空格 在服务里面查看结果 2.设置服务格式: sc ...

  9. C# 排序列表(SortedList)

    SortedList 类代表了一系列按照键来排序的键/值对,这些键值对可以通过键和索引来访问. 排序列表是数组和哈希表的组合.它包含一个可使用键或索引访问各项的列表.如果您使用索引访问各项,则它是一个 ...

  10. RibbitMQ 实战教程

    # RabbitMQ 实战教程 ## 1.MQ引言 ### 1.1 什么是MQ `MQ`(Message Quene) : 翻译为 `消息队列`,通过典型的 `生产者`和`消费者`模型,生产者不断向消 ...