3 回答
TA贡献2016条经验 获得超9个赞
看起来带有数据库的测试容器已成功启动,因此没有问题,您将得到一个空数据库。
然后你尝试运行飞行路线,但失败了。Spring Boot中的Flyway在Spring应用程序上下文初始化期间工作,因此实际迁移在应用程序上下文初始化时运行,因此迁移失败看起来像Spring失败。
但是,记录了原因:迁移文件包含无效内容:
Migration V1__initial_user.sql failed
-------------------------------------
SQL State : 42601
Error Code : 0
Message : ERROR: syntax error at or near "GENERATED"
Position: 45
Location : db/migration/V1__initial_user.sql (/Users/villemossip/Desktop/GRP/GRP-
SAS/application/build/resources/main/db/migration/V1__initial_user.sql)
Line : 36
Statement : CREATE TABLE revinfo
(
rev INTEGER GENERATED BY DEFAULT AS IDENTITY ( START WITH 1 ),
revtstmp BIGINT,
PRIMARY KEY (rev)
)
这GENERATED BY是不受支持的。
为什么?您的 docker 映像可能包含不支持此语法的 RDBMS 版本。所以它和你在没有docker的本地环境中使用的DB不同。
无论如何,这不是关于 docker、spring 或 Flyway 的问题,而是关于数据库和迁移代码的问题。
在分辨率方面,我建议直接运行DB的docker镜像(不带java、testcontainers和flyway)。当它运行时,只需在 pgadmin 或其他东西中“手动”运行此迁移即可。您预计会看到相同的错误。
TA贡献1831条经验 获得超9个赞
就我而言,我在 application.properties 文件中添加了
spring.flyway.baselineOnMigrate = true
我还必须从版本 1.1 而不是 1 开始,否则 Flyway 会抛出错误(flyway 8.0.5)
TA贡献1806条经验 获得超8个赞
我发现问题出在 Postgres 版本上。由于某种原因,默认情况下,docker 镜像是使用旧版本 9.6.12 创建的,但 SQL 脚本GENERATED BY DEFAULT已添加到版本 10 的 Postgres 中。
解决方案1(将sql脚本更新到旧版本):
CREATE TABLE revinfo
(
rev INTEGER PRIMARY KEY NOT NULL,
revtstmp BIGINT
);
解决方案2: 通过在项目中创建CustomPostgreSQLContainer文件将docker镜像版本更改为11.2。
import org.testcontainers.containers.PostgreSQLContainer;
public class CustomPostgreSQLContainer extends PostgreSQLContainer<CustomPostgreSQLContainer> {
private static final String IMAGE_VERSION = "postgres:11.2";
private static CustomPostgreSQLContainer container;
CustomPostgreSQLContainer() {
super(IMAGE_VERSION);
}
public static CustomPostgreSQLContainer getInstance() {
if (container == null) {
container = new CustomPostgreSQLContainer();
}
return container;
}
@Override
public void start() {
super.start();
System.setProperty("spring.datasource.url", container.getJdbcUrl());
System.setProperty("spring.datasource.username", container.getUsername());
System.setProperty("spring.datasource.password", container.getPassword());
}
@Override
public void stop() {
//do nothing, JVM handles shut down
}
}
并更新 BaseIntTest 文件:
@Testcontainers
@SpringBootTest
public class BaseIntTest {
@Container
private static final PostgreSQLContainer<?> container = CustomPostgreSQLContainer.getInstance();
最后从测试 application.properties 文件中删除两行:
spring.datasource.driver-class-name=org.testcontainers.jdbc.ContainerDatabaseDriver
spring.datasource.url=jdbc:tc:postgresql://localhost:5433/test
添加回答
举报