3 回答

TA貢獻2016條經(jīng)驗 獲得超9個贊
看起來帶有數(shù)據(jù)庫的測試容器已成功啟動,因此沒有問題,您將得到一個空數(shù)據(jù)庫。
然后你嘗試運行飛行路線,但失敗了。Spring Boot中的Flyway在Spring應(yīng)用程序上下文初始化期間工作,因此實際遷移在應(yīng)用程序上下文初始化時運行,因此遷移失敗看起來像Spring失敗。
但是,記錄了原因:遷移文件包含無效內(nèi)容:
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的本地環(huán)境中使用的DB不同。
無論如何,這不是關(guān)于 docker、spring 或 Flyway 的問題,而是關(guān)于數(shù)據(jù)庫和遷移代碼的問題。
在分辨率方面,我建議直接運行DB的docker鏡像(不帶java、testcontainers和flyway)。當(dāng)它運行時,只需在 pgadmin 或其他東西中“手動”運行此遷移即可。您預(yù)計會看到相同的錯誤。

TA貢獻1831條經(jīng)驗 獲得超9個贊
就我而言,我在 application.properties 文件中添加了
spring.flyway.baselineOnMigrate = true
我還必須從版本 1.1 而不是 1 開始,否則 Flyway 會拋出錯誤(flyway 8.0.5)

TA貢獻1806條經(jīng)驗 獲得超8個贊
我發(fā)現(xiàn)問題出在 Postgres 版本上。由于某種原因,默認(rèn)情況下,docker 鏡像是使用舊版本 9.6.12 創(chuàng)建的,但 SQL 腳本GENERATED BY DEFAULT已添加到版本 10 的 Postgres 中。
解決方案1(將sql腳本更新到舊版本):
CREATE TABLE revinfo
(
rev INTEGER PRIMARY KEY NOT NULL,
revtstmp BIGINT
);
解決方案2: 通過在項目中創(chuàng)建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
添加回答
舉報