데이터베이스 마이그레이션 Flyway

6119 단어

Flyway가 필요한 이유


일상적인 개발에서 이런 장면을 자주 볼 수 있다
  • 샤오홍은 하나의 모듈을 개발하여 로컬 데이터베이스에 두 개의 필드를 추가하고dao층의 코드를 변경하여git에 제출했다.이때 황 군이 코드를 꺼내서 런이 잘못 보고했을 가능성이 높다.
  • 만약에 정식 환경에 접속할 때 정식 데이터베이스에서 sql 스크립트를 실행하는 것을 잊어버리면 심각한 문제를 초래할 수 있다.
  • 전통적인 해결 방식은 고정된 곳에 sql 스크립트를 추가하고 개발자가 서로 소통하여 어떤 sql 스크립트를 실행하는지
  • Flyway는 이러한 문제를 해결하고 프로젝트 컴파일링 기간에 데이터베이스에 변경 사항을 쓸 수 있습니다.시동만 성공하면 문제없다.

    Flyway 가져오기


    Gradle이면 build.gradle에 의존 추가
    compile "org.flywaydb:flyway-core:4.1.2"
    

    Maven 에 의존도 추가 pom.xml
    
      org.flywaydb
      flyway-core
      4.0.3
    
    

    실제 사용


    Spring Boot,Gradle을 사용하여 프로젝트를 구축하고 의존도를 추가합니다.
    개발된 프로젝트라면 베이스라인 On Migrate를 켜야 합니다. 그렇지 않으면 이상을 던집니다.
    Found non-empty schema(s) `reshelf2` without metadata table! Use baseline() or set baselineOnMigrate to true to initialize the metadata table. 
    

    응용 프로그램properties 구성 추가
    flyway.baselineOnMigrate=true
    

    물론 인터페이스도 가능하죠.
    @Component
    public class BaselineOnMigrateMigrationStrategy implements FlywayMigrationStrategy {
        @Override
        public void migrate(Flyway flyway) {
            flyway.setBaselineOnMigrate(true);
            flyway.migrate();
        }
    }
    

    데이터베이스의 schema_version는 비교 스크립트 버전을 저장하는 표입니다.
    ql 스크립트 기본 위치 classpath:db/migration파일ql 끝, 이름 V 자 시작, 뒤 숫자 는 버전 번호 예: V1init.sql
    출처 org.flywaydb.core.Flyway
     /**
         * The locations to scan recursively for migrations.
         * 
         * 

    The location type is determined by its prefix. * Unprefixed locations or locations starting with {@code classpath:} point to a package on the classpath and may * contain both sql and java-based migrations. * Locations starting with {@code filesystem:} point to a directory on the filesystem and may only contain sql * migrations.

    * * (default: db/migration) */ private Locations locations = new Locations("db/migration"); /** * The encoding of Sql migrations. (default: UTF-8) */ private String encoding = "UTF-8"; /** * The schemas managed by Flyway. These schema names are case-sensitive. (default: The default schema for the datasource connection) *

    Consequences:

    *
      *
    • The first schema in the list will be automatically set as the default one during the migration.
    • *
    • The first schema in the list will also be the one containing the metadata table.
    • *
    • The schemas will be cleaned in the order of this list.
    • *
    */ private String[] schemaNames = new String[0]; /** *

    The name of the schema metadata table that will be used by Flyway. (default: schema_version)

    By default * (single-schema mode) the metadata table is placed in the default schema for the connection provided by the * datasource.

    When the flyway.schemas property is set (multi-schema mode), the metadata table is * placed in the first schema of the list.

    */ private String table = "schema_version"; /** * The target version up to which Flyway should consider migrations. Migrations with a higher version number will * be ignored. The special value {@code current} designates the current version of the schema (default: the latest version) */ private MigrationVersion target = MigrationVersion.LATEST; /** * Whether placeholders should be replaced. (default: true) */ private boolean placeholderReplacement = true; /** * The map of <placeholder, replacementValue> to apply to sql migration scripts. */ private Map placeholders = new HashMap(); /** * The prefix of every placeholder. (default: ${ ) */ private String placeholderPrefix = "${"; /** * The suffix of every placeholder. (default: } ) */ private String placeholderSuffix = "}"; /** * The file name prefix for sql migrations. (default: V) * *

    Sql migrations have the following file name structure: prefixVERSIONseparatorDESCRIPTIONsuffix , * which using the defaults translates to V1_1__My_description.sql

    */ private String sqlMigrationPrefix = "V"; /** * The file name prefix for repeatable sql migrations. (default: R) * *

    Repeatable sql migrations have the following file name structure: prefixSeparatorDESCRIPTIONsuffix , * which using the defaults translates to R__My_description.sql

    */ private String repeatableSqlMigrationPrefix = "R"; /** * The file name separator for sql migrations. (default: __) * *

    Sql migrations have the following file name structure: prefixVERSIONseparatorDESCRIPTIONsuffix , * which using the defaults translates to V1_1__My_description.sql

    */ private String sqlMigrationSeparator = "__"; /** * The file name suffix for sql migrations. (default: .sql) * *

    Sql migrations have the following file name structure: prefixVERSIONseparatorDESCRIPTIONsuffix , * which using the defaults translates to V1_1__My_description.sql

    */ private String sqlMigrationSuffix = ".sql";

    사용자 정의 설정은 가능하지만, 사용하지 않는 것을 권장합니다.
    주의: sql 스크립트는 해당하는 버전 번호가 필요합니다. 예를 들어 V2__init.sql를 실행하려면 V1__init.sql를 기준으로 비교한 다음에flyway가 해당하는 sql 스크립트를 실행할 수 있습니다.
    일부 링크
    https://flywaydb.org/documentation/gradle/
    http://stackoverflow.com/questions/33029311/setting-flyway-baselineonmigrate-and-baselineversion-using-spring-boot-prope
    http://stackoverflow.com/questions/30013953/how-to-use-jdbc-authentication-of-spring-boot-spring-security-with-flyway
    https://github.com/spark-jobserver/spark-jobserver/issues/503

    좋은 웹페이지 즐겨찾기