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-4.3.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-4.3.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"/>

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

问题:
1、查了很久没找到怎么修改字段的描述,每次修改描述都要删除字段,再重新添加回去,但这样会导致数据丢失,很烦。
解决方法:

<changeSet id="105xxxxx-81" author="lzh">
    <sqlFile path="liquibase/changelogs/chang_device_link_config_type.sql" encoding="UTF-8" />
</changeSet>

chang_device_link_config_type.sql文件内容:
comment on column device_link_rule_action."type" is '执行动作类型:0-属性, 1-服务, 2-下工单';

新发现:

<!-- 设置Column注释, xsd版本需要在4.3以上:http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.3.xsd-->
<setColumnRemarks tableName="tb2_member" columnName="nick_name_new"  remarks="A String"  /> 

<!-- 修改字段名称->
<renameColumn tableName="tb2_member" oldColumnName="nick_name" newColumnName="nick_name_new" />

<!-- 修改字段类型 ( https://blog.csdn.net/m0_38105216/article/details/83896599 ) -->
<modifyDataType tableName="tb2_member" columnName="nick_name_new" newDataType="varchar(20)" />

<!-- 去除默认值-->
<dropDefaultValue tableName="devices_area" columnName="area_no"/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值