Testcontainers集成Liquibase遇数据库/变更日志表未找到问题
我正尝试在Java 17/Spring Boot 3.1.6项目中集成Testcontainers,使用SQL Server镜像mcr.microsoft.com/mssql/server:2017-CU12,搭配liquibase 4.25.1做数据库版本管理。为简化操作,希望用JDBC字符串方式配置,不想在测试类里显式创建/管理容器(此前项目刚从Gradle切换到Maven,同时升级了JUnit 5)。
尝试1:直接使用带数据库名的JDBC URL
最初使用的JDBC连接字符串:jdbc:tc:sqlserver:///database-name(也尝试过四个斜杠,无效果),触发报错:
liquibase.exception.DatabaseException: Database 'database-name' does not exist. Make sure that the name is entered correctly. [Failed SQL: (911) USE database-name;]
该异常由liquibase脚本抛出,移除所有USE database-name语句后测试可正常运行,但修改现有脚本不可行。
尝试2:通过TC_INITSCRIPT初始化数据库
将JDBC URL修改为:jdbc:tc:sqlserver:///database-name?TC_INITSCRIPT=file:src/test/resources/init-test.sql,其中init-test.sql的内容为:
USE master CREATE DATABASE database-name
此时报错变为:
liquibase.exception.DatabaseException: Invalid object name 'DATABASECHANGELOG'
liquibase尝试执行变更集时无法访问内部表。
我的猜测
- Testcontainers忽略了URL中的数据库名
- 通过初始化脚本创建的数据库,未给liquibase使用的用户分配创建表的权限
内容的提问来源于stack exchange,提问作者Paulina

