Liquibase的changelog.xml文件怎么写 数据库变更管理

1次阅读

liquibase 的 changelog.xml 是定义数据库变更的核心 xml 文件,以 为根标签并声明命名空间,每个 需唯一标识(id+author),支持建表、加字段等操作,通过 和 保障安全与可维护性。

Liquibase的changelog.xml文件怎么写 数据库变更管理

Liquibase 的 changelog.xml 是定义数据库变更的核心文件,它用 XML 描述一系列有序的数据库操作(如建表、加字段、改类型、插数据等),确保不同环境(开发、测试、生产)数据库结构一致且可追溯。

changelog.xml 基本结构和必需元素

一个合法的 changelog 文件必须以 <databasechangelog></databasechangelog> 根标签开始,并声明 Liquibase 命名空间。每个变更(changeSet)需有唯一标识(id + author 组合全局唯一),推荐加上 logicalFilePath 避免重命名导致重复执行。

  • <databasechangelog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"></databasechangelog> —— 必须声明命名空间
  • <changeset id="1" author="alice"></changeset> —— 每个 changeSet 必须含 id 和 author
  • 建议添加 logicalFilePath="changelog.xml" 属性(写在根标签或 changeSet 内),用于校验文件路径变更
  • changeSet 默认是原子执行的(失败则回滚),如需跳过回滚可加 runWith="sql" 或设 failOnError="false"(慎用)

常用 changeSet 类型写法示例

XML 中通过内置标签表达具体操作,无需手写 SQL(但支持 <sql></sql> 直接嵌入)。常见操作如下:

  • 创建表:<createtable tablename="user"><column name="id" type="BIGINT" autoincrement="true"></column></createtable>
  • 添加字段:<addcolumn tablename="user"><column name="email" type="VARCHAR(255)"></column></addcolumn>
  • 修改字段类型:<modifydatatype columnname="name" newdatatype="TEXT" tablename="user"></modifydatatype>
  • 插入初始数据:<insert tablename="role"><column name="name" value="ADMIN"></column></insert>
  • 删除约束:<dropforeignkeyconstraint basetablename="order" constraintname="fk_order_user_id"></dropforeignkeyconstraint>

如何保证变更安全与可维护性

实际项目中,仅写对语法不够,还需考虑执行顺序、重复执行、环境适配等问题:

  • <pre class="brush:php;toolbar:false;" conditions></pre> 判断前置条件,例如“只在 postgresql 上执行”或“表不存在时才建表”,避免报错中断
  • 对可能重复执行的操作(如 insert),加上 runOnChange="true" 或用 <sqlcheck></sqlcheck> 判断是否存在再执行
  • 敏感变更(如 dropColumn)建议先用 failOnError="false" + 日志提醒,上线前人工确认
  • 把大 changelog 拆成多个子文件,用 <include file="v1.0/users.xml"></include> 引入,便于团队协作和版本管理

配合 Liquibase CLI 或 spring Boot 使用要点

文件写好后,需被 Liquibase 正确识别和执行:

  • spring boot 项目中,将 changelog.xml 放在 src/main/resources/db/changelog/,并在 application.yml 中配置:spring.liquibase.change-log: classpath:/db/changelog/changelog.xml
  • 命令行执行时,确保 --changeLogFile 指向正确路径,且数据库连接信息无误
  • 首次运行会自动建 databasechangelogdatabasechangeloglock 表,后续所有变更都记录在前者中,不可手动删
  • 若需回退,用 rollback 命令(前提是每个 changeSet 都写了对应的 <rollback></rollback> 子标签)
text=ZqhQzanResources