Spring Boot集成Liquibase+MongoDB启动时未执行数据库迁移问题
我之前也碰到过类似的情况,折腾了好一会儿才搞定,下面给你几个排查和解决的方向:
1. 修正数据库配置(关键!)
你现在用了spring.datasource配置,但这是针对关系型数据库的配置方式,MongoDB作为非关系型数据库,Liquibase扩展需要专门的配置项。把你的application配置改成这样:
spring: application: name: photo-app-liquibase data: mongodb: uri: mongodb://localhost:27017/photo-app liquibase: mongodb: uri: mongodb://localhost:27017/photo-app change-log: classpath:db/changelog/db.changelog-master.xml enabled: true # 显式开启Liquibase,避免自动配置失效
解释一下:spring.data.mongodb.uri是Spring Data MongoDB的连接配置,而liquibase.mongodb.uri是Liquibase MongoDB扩展需要的连接参数,两个都得配上,不然Liquibase找不到MongoDB的连接信息。
2. 修正变更日志的文件路径
你的主变更日志db.changelog-master.xml已经放在src/main/resources/db/changelog目录下了,所以<include>标签里的路径应该用相对路径,不需要再加db/changelog/前缀。改成:
<include file="20201029215628_create-users-table.xml"/>
如果还是不行,可以试试绝对路径写法:classpath:db/changelog/20201029215628_create-users-table.xml。
3. 检查依赖版本兼容性
你用的liquibase-mongodb是4.1.1版本,这个版本比较老了,建议和Spring Boot管理的liquibase-core版本做匹配。比如查看项目依赖树里的liquibase-core版本,然后选择同大版本的liquibase-mongodb:
<dependency> <groupId>org.liquibase.ext</groupId> <artifactId>liquibase-mongodb</artifactId> <!-- 比如liquibase-core是4.9.x,就用对应版本的扩展 --> <version>4.9.1</version> </dependency>
版本不兼容很容易导致Liquibase的MongoDB扩展无法正常初始化。
4. 开启Liquibase日志排查
默认的日志级别可能看不到Liquibase的执行细节,你可以在application配置里添加日志配置,看看Liquibase到底有没有加载变更日志:
logging: level: liquibase: DEBUG
启动后如果能看到Liquibase相关的DEBUG日志,就能知道是找不到文件、连接有问题,还是没有需要执行的变更。
5. 确认变更日志的语法正确性
MongoDB的Liquibase变更语法和关系型数据库不一样,比如创建集合的写法应该是这样的(给你个示例):
<?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" xmlns:mongodb="http://www.liquibase.org/xml/ns/mongodb" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.9.xsd http://www.liquibase.org/xml/ns/mongodb http://www.liquibase.org/xml/ns/mongodb/liquibase-mongodb-4.9.xsd"> <changeSet id="20201029215628" author="your-name"> <mongodb:createCollection collectionName="users"/> </changeSet> </databaseChangeLog>
要注意引入mongodb的命名空间,并且用MongoDB专属的变更标签,不能用关系型数据库的createTable之类的标签,不然Liquibase会识别不了。
按照上面的步骤一步步排查,应该就能解决迁移不执行的问题了~
内容的提问来源于stack exchange,提问作者user4383363

