Sql语句在由开发环境发布到其他环境时,也是个老大难的问题,用过文档记录、sql代码git管理都不是很满意,毕竟都要手动记录哪些sql执行了,哪些没执行,没执行的还要手动执行,尤其是在内网环境,sql文件可能还需要找人转手执行。
无意中发现了liquebase 和flyway ,一开始选的flyway,毕竟入手快,用mysql执行正常,但与自己的oracle不兼容,所以改用liquebase,研究后,发现基本功能还是比较好入手的,推荐下。
开始下手,简单分3个步骤:
1,pom文件加配置
2,application.properties(yml)加下配置
3,添加对应的基本配置文件(目的是告诉liquebase 要怎么执行sql)
4,程序启动
1,pom文件加配置
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<version>4.5.0</version>
</dependency>
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<propertyFile>src/main/resources/db/liquibase.properties</propertyFile>
<propertyFileWillOverride>true</propertyFileWillOverride>
<outputChangeLogFile>src/main/resources/db/changelog/changelog_init.xml</outputChangeLogFile>
</configuration>
</plugin>
2,application.properties(yml)加下配置
#liquebase spring.liquibase.enabled=true spring.liquibase.change-log=classpath:db/changelog-master.xml
spring.liquibase.change-log :这个不配置也行,但就会走默认路径:src/main/resources/db/changelog/db.changelog-master.yaml
3,添加对应的基本配置文件
(目的是告诉liquebase 要怎么执行sql)
(1)如果在第二部配置了spring.liquibase.change-log=classpath:db/changelog-master.xml,就看这个:直接用的sql语句的
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
https://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.5.xsd">
<!-- <include file="classpath:db/changelog/changelog_init.xml"/>-->
<include file="classpath:db/changelog/changelog_v1.0.xml"/>
<include file="classpath:db/changelog/changelog_v2.0.xml"/>
</databaseChangeLog>
前几行就是个固定格式,可以先忽略,重点看下:
<include file="classpath:db/changelog/changelog_v1.0.xml"/>
这个是我把要执行的sql 单独拎出来了,可以分多个文件(组团开发时,可以按小组/人拆分;多个版本迭代时,也可以按版本进行拆分)。
然后看下changelog_v1.0.xml
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
https://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.5.xsd">
<!--
changeset:一个changelog可以包含多个changeset标签,每个changeset都由id、author、filepath属性唯一标识,
当liquibase执行数据库changeLog时,他会按顺序读取changeSet,并针对每个changeSet检查databasechangelog表,
已查看是否已经运行过id/author/filepath的组合,如果已运行且没有runAlways标签则会跳过该changeSet
author:作者
id:最好使用<项目名-时间戳>来命名区分
runAlways:执行每次运行时设置的更改,即使之前已经运行过了
context:灵活控制脚本在哪些环境中执行
-->
<changeSet id="reference-20231020-2101" author="y">
<sql>
alter table AA10
add TEST_LI2 VARCHAR2(20);
</sql>
</changeSet>
<changeSet id="reference-20231020-001" author="y">
<sql>
alter table AA10
add TEST_LI3 VARCHAR2(20);
alter table AA10
add TEST_LI4 VARCHAR2(20);
</sql>
</changeSet>
</databaseChangeLog>
开头是固定格式,直接看 changeset就行,id建议有一定规则,author 不能为空,可以写自己的名字代号,sql里就是要执行的sql,
(2)如果跳过了第二步骤,也可以
就看默认的路径文件:db.changelog-master.yaml,注意不能为空
databaseChangeLog:
- include:
file: db/changelog/changelog_v1.0.xml
- changeSet:
id: 1
author: zktest
changes:
- createTable:
tableName: person01
columns:
- column:
name: stu_name
type: varchar(50)
- column:
name: stu_no
type: varchar(50)
constraints:
nullable: false
- column:
name: state
type: char(2)
include:file 是引用了另一个配置文件,这个文件往上一点也有写,里面内容不用动,这样就可以执行这个文件里的配置了。
再往下就是一个建表的配置,表名person01,有3个字段信息
其他的配置可以自己再搜搜,个人感觉还是喜欢直接用sql
4,最后,程序启动,sql也自动执行了。
呜呜呜,火车来了, 同时数据库里会自动创建2个表:DATABASECHANGELOG、DATABASECHANGELOGLOCK
DATABASECHANGELOG:会记录sql的执行情况
注意:已经执行过的sql配置不要动,DATABASECHANGELOG表中存对应的md5加密的值,如果sql配置改了,对应的md5的值就和数据库里存的不一样了,就报错了