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¤tSchema=$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¤tSchema=$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"/>
以上是关于Springboot整合liquibase的主要内容,如果未能解决你的问题,请参考以下文章