Springboot整合liquibase

Posted weixin_42412601

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Springboot整合liquibase相关的知识,希望对你有一定的参考价值。

1、依赖
这里数据源使用的是postgresql

<!--		liquibase-->
		<dependency>
			<groupId>org.liquibase</groupId>
			<artifactId>liquibase-core</artifactId>
		</dependency>
		<!--postgresql-->
		<dependency>
			<groupId>org.postgresql</groupId>
			<artifactId>postgresql</artifactId>
			<version>42.2.14</version>
		</dependency>
		<!--mybatis-plus-->
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.4.1</version>
		</dependency>

2、配置

spring:
  liquibase:
    # 开启 liquibase
    enabled: true
    # 配置 changlog 文件路径
    change-log: classpath:liquibase/master.xml
    url: jdbc:postgresql://$POSTGRES_HOST:39.98.xxx.xxx:$POSTGRES_PORT:xxx/$POSTGRES_DATABASE:xxx?sslmode=disable&currentSchema=$POSTGRES_CURRENTSCHEMA:test
    user: $POSTGRES_USERNAME:xxx
    password: $POSTGRES_PASSWORD:123456
  datasource:
    username: $POSTGRES_USERNAME:xxx
    password: $POSTGRES_PASSWORD:123456
    driver-class-name: org.postgresql.Driver
    url: jdbc:postgresql://$POSTGRES_HOST:39.98.xxx.xxx:$POSTGRES_PORT:xxxx/$POSTGRES_DATABASE:xxx?sslmode=disable&currentSchema=$POSTGRES_CURRENTSCHEMA:test
mybatis-plus:
  mapper-locations=classpath: mapper/*xml

3、配置类

@Configuration
public class LiquibaseConfig 

    @Qualifier("dataSource")
    private DataSource dataSource;


//    更多配置:
//
//    spring.liquibase.change-log 配置文件的路径,默认值为 classpath:/db/changelog/db.changelog-master.yaml
//    spring.liquibase.check-change-log-location 检查 change log的位置是否存在,默认为true.
//    spring.liquibase.contexts 用逗号分隔的运行环境列表。
//    spring.liquibase.default-schema 默认数据库 schema
//    spring.liquibase.drop-first 是否先 drop schema(默认 false)
//    spring.liquibase.enabled 是否开启 liquibase(默认为 true)
//    spring.liquibase.password 数据库密码
//    spring.liquibase.url 要迁移的JDBC URL,如果没有指定的话,将使用配置的主数据源.
//    spring.liquibase.user 数据用户名
//    spring.liquibase.rollback-file 执行更新时写入回滚的 SQL文件

    @Bean
    public SpringLiquibase liquibase() 
        SpringLiquibase liquibase = new SpringLiquibase();
        liquibase.setDataSource(dataSource);
        liquibase.setChangeLog("classpath:liquibase/master.xml");
//        liquibase.setContexts("development,test,preproduction,production");
//        liquibase.setShouldRun(true);
        return liquibase;
    

    @Autowired
    public void setDataSource(DataSource dataSource) 
        this.dataSource = dataSource;
    

4、创建master.xml

<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
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
</databaseChangeLog>

5、启动项目

自动生成两张表

6、简单使用
创建表

<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
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
         
    <changeSet id="1" author="lzh">
        <createTable tableName="device_business_purpose" remarks="业务用途表">
            <column name="id" type="int8" autoIncrement="true" remarks="id">
                <constraints nullable="false" primaryKey="true" primaryKeyName="device_business_purpose_id"></constraints>
            </column>
            <column name="name" type="varchar(32)" remarks="业务用途名称"></column>
            <column name="is_deleted" type="int2" defaultValue="0" remarks="逻辑删除"/>
            <column name="create_time" remarks="创建时间" type="TIMESTAMP" defaultValueComputed="CURRENT_TIMESTAMP"/>
            <column name="update_time" remarks="更新时间" type="TIMESTAMP" defaultValueComputed="CURRENT_TIMESTAMP"/>
            <column name="create_user_id" remarks="创建用户id" type="BIGINT" defaultValue= "0"/>
            <column name="create_by" remarks="创建用户" type="VARCHAR(32)" defaultValue=""/>
            <column name="update_by" remarks="更新用户" type="VARCHAR(32)" defaultValue=""/>
        </createTable>
    </changeSet>
    
</databaseChangeLog>

启动项目

其他

// 新增删除字段
    <changeSet id="10531644-50" author="lzh">
        <dropColumn tableName="devices_device" columnName="devices_id" />
        <addColumn tableName="devices_device">
            <column name="devices_id" type="VARCHAR" remarks="设备编号(用于识别设备)"/>
        </addColumn>
    </changeSet>
// 修改字段的类型
    <changeSet id="10531644-49" author="lzh">
        <modifyDataType tableName="devices_floor" columnName="floor" newDataType="int4"/>
    </changeSet>
// 如果master.xml 写的太多了,可以在另一个文件中继续写
 <include file="master2.xml" relativeToChangelogFile="true"/>

以后各个环境的表结构,都能自动同步啦

以上是关于Springboot整合liquibase的主要内容,如果未能解决你的问题,请参考以下文章

Springboot整合liquibase

Springboot整合liquibase

Liquibase/Springboot 启动异常

Spring boot - 在启动时禁用 Liquibase

springboot集成liquibase

Spring Boot 和 Liquibase 示例