source

Flyway: 스키마 기록 테이블이 없는 "공개" 스키마를 찾았습니다!baseline() 사용 - 빈 데이터베이스에서

manycodes 2023. 2. 10. 22:10
반응형

Flyway: 스키마 기록 테이블이 없는 "공개" 스키마를 찾았습니다!baseline() 사용 - 빈 데이터베이스에서

kotlin Spring 부트, jpa 및 postgre를 사용하여 플라이웨이를 설정하려고 합니다.SQL. 나의 그래들 의존관계는 다음과 같습니다.

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-data-jpa')
    implementation('org.springframework.boot:spring-boot-starter-web')
    implementation('com.fasterxml.jackson.module:jackson-module-kotlin')
    implementation('org.flywaydb:flyway-core')
    implementation('com.google.code.gson:gson')
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    runtimeOnly('org.postgresql:postgresql')
    testImplementation('org.springframework.boot:spring-boot-starter-test')
}

application.properties 파일은 다음과 같습니다.

spring.datasource.driverClassName=org.postgresql.Driver
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.datasource.url=jdbc:postgresql://${JDBC_DATABASE_URL}/jpaTestDatabase
spring.datasource.username=${JDBC_DATABASE_USERNAME}
spring.datasource.password=${JDBC_DATABASE_PASSWORD}

flyway.baseline-on-migrate=true
flyway.locations=classpath:src/main/kotlin/db/migration

spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=validate
spring.session.store-type=none

jpa 와 휴지 상태를 사용하여 테이블과 엔트리를 작성하는 것은 예상대로 동작합니다.그러나 빈 데이터베이스로의 이행 예는 다음과 같습니다.

org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: 
Invocation of init method failed; nested exception is org.flywaydb.core.api.FlywayException: 
Found non-empty schema(s) "public" without schema history table! Use baseline() or set baselineOnMigrate to true to initialize the schema history table.

디렉토리 구조는 spring initializer에 의해 생성된 기본 구조이며 이행은 다음과 같습니다.demo/src/main/kotlin/db/migration

이행은 1개뿐입니다.이 예에서는 다음과 같이 수정한 이행 예시를 코틀린화한 버전입니다.

class V1__Sample : BaseJavaMigration() {
  override fun migrate(context: Context?) {
    val statement = context?.connection?.prepareStatement(
      """
        CREATE TABLE article (
          id bigserial primary key,
          name varchar(20) NOT NULL,
          desc text NOT NULL
        );
      """
    )
    statement.use { it?.execute() }
  }
}

내가 뭘 놓쳤지?데이터베이스가 완전히 비어 있는데(깨끗한 도커 이미지) 스키마 기록 테이블 없이 비어 있지 않은 스키마를 찾는 것에 대해 Flyway가 계속 불평하는 이유는 무엇입니까?

spring-boot 버전2 를 사용하고 있는 것을 전제로 합니다.

스프링 부트 2에서는 프리픽스는 "spring"입니다.flyway"라고 하는 프레픽스를 추가해 보겠습니다.spring아래와 같이.

spring.flyway.baseline-on-migrate = true

또는

spring.flyway.baselineOnMigrate = true

시도해 볼 수 있을 것이다 mvn flyway:clean && mvn flyway:migrate

데이터베이스의 검색 경로를 확인하십시오. (플라이웨이가 로그 테이블을 만들고 있는) 공용 스키마가 처음부터 없으면 로그 테이블을 찾을 수 없고 스키마 기록을 찾을 수 없다는 불만이 제기될 수 있습니다.

베이스라인을 설정할 경우 스크립트 폴더에서 오래된 스크립트를 삭제해야 합니다.삭제하지 않으면 다시 시도됩니다.

언급URL : https://stackoverflow.com/questions/53172123/flyway-found-non-empty-schemas-public-without-schema-history-table-use-bas

반응형