Liquibase建表时如何为所有表统一添加相同公共字段?
Liquibase公共字段复用实现方案
Liquibase完全支持你需要的公共字段复用能力,不需要在每个createTable配置中重复编写相同字段,以下是两种最常用的实现方式:
方案一:原生可复用片段(对应标签引用写法)
Liquibase 3.5及以上版本内置了<define>标签,可用来定义可复用的配置片段,使用步骤如下:
- 在全局公共changelog中定义公共字段片段:
<!-- 定义公共字段模板 --> <define name="commonColumns"> <column name="id" type="BIGINT" autoIncrement="true"> <constraints primaryKey="true" nullable="false"/> </column> <column name="creation_date" type="TIMESTAMP" defaultValueComputed="CURRENT_TIMESTAMP"> <constraints nullable="false"/> </column> <column name="updated_date" type="TIMESTAMP" defaultValueComputed="CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"> <constraints nullable="false"/> </column> </define>
- 在所有需要添加公共字段的
<createTable>标签中直接引用该片段即可:
<createTable name="my_table"> <commonColumns/> <!-- 下方编写业务自定义字段 --> <column name="order_no" type="VARCHAR(32)"> <constraints nullable="false" unique="true"/> </column> <column name="amount" type="DECIMAL(10,2)"/> </createTable>
注意:
<define>定义的片段作用域为当前changelog及所有被当前changelog引入的子changelog,建议将公共字段片段定义在根changelog的最顶部,或者单独存储为公共changelog文件,在根changelog中优先引入。
方案二:自定义extends属性(对应继承写法)
Liquibase原生没有内置<createTable>的extends属性,但可以通过轻量扩展实现该能力:
- 如果使用Groovy DSL编写changelog,可以直接通过DSL扩展方法给CreateTable语句追加公共字段
- 如果使用XML格式changelog,可以自定义Liquibase预处理器,识别createTable标签的extends属性,自动注入公共字段配置
- 全库所有表都需要追加公共字段的场景,也可以直接配置全局modifySql规则,给所有建表语句批量追加公共字段的SQL,无需修改任何createTable配置
内容的提问来源于stack exchange,提问作者Pavel Polyakoff
相关产品推荐
相关产品推荐

