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