Spring Boot Flyway管理資料庫版本 - josdem

banq發表於2019-01-17

您知道在軟體開發中使用版本控制的好處,例如GitSubversion。這次我將向您展示Flyway來管理資料庫的版本控制,因此您可以使用Gradle和Spring Boot 輕鬆跟蹤架構在所有環境中的演變。

讓我們開始建立一個包含web和jpa依賴項的新Spring Boot專案:

spring init --dependencies=web,jpa --language=groovy --build=gradle spring-boot-flyway

這是生成的build.gradle檔案:

buildscript {
  ext {
    springBootVersion = '1.5.12.RELEASE'
  }
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
  }
}

apply plugin: 'groovy'
apply plugin: 'org.springframework.boot'

version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
  mavenCentral()
}

dependencies {
  compile 'org.springframework.boot:spring-boot-starter-web'
  compile 'org.springframework.boot:spring-boot-starter-data-jpa'
  compile 'mysql:mysql-connector-java:5.1.34'
  compile 'org.codehaus.groovy:groovy'
  testCompile 'org.springframework.boot:spring-boot-starter-test'
}

然後讓我們在gradle.properties新增Flyway外掛來連線到MySQL資料庫:

plugins {
  id "org.flywaydb.flyway" version "5.0.7"
}

flyway {
  url = 'jdbc:mysql://localhost:3306/flyway_demo'
  user = 'flywayUser'
  password = 'flywaySecret'
}

現在讓我們建立第一個遷移src/main/resources/db/migration/V1__person_create.sql:

DROP TABLE IF EXISTS `person`;
CREATE TABLE `person` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `firstname` varchar(255) NOT NULL,
  `lastname` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
);

其次,讓我們新增第二個遷移src/main/resources/db/migration/V2__person_insert.sql:

INSERT INTO `person` VALUES (1, 'Jose Luis', 'De la Cruz Morales'), (2, 'Eric', 'Haddad')

讓我們執行Flyway來使用gradle遷移我們的資料庫:

gradle flywayMigrate -i

如果一切順利,您應該看到以下輸出:

Flyway Community Edition 5.0.7 by Boxfuse
Database: jdbc:mysql://localhost:3306/flyway_demo (MySQL 5.7)
Successfully validated 2 migrations (execution time 00:00.039s)
Current version of schema `flyway_demo`: << Empty Schema >>
Migrating schema `flyway_demo` to version 1 - person create
Migrating schema `flyway_demo` to version 2 - person insert
Successfully applied 2 migrations to schema `flyway_demo` (execution time 00:00.985s)

我們可以在gradle 按照以下方式執行依賴於bootRun任務的flywayMigrate任務:

bootRun.dependsOn rootProject.tasks['flywayMigrate']

Flyway使用VX__description.sql約定名稱。我們application.properties用來指定嵌入式資料庫驅動程式類,憑證和ddl(資料定義語言)策略。

spring.datasource.url=jdbc:mysql://localhost:3306/flyway_demo
spring.datasource.username=flywayUser
spring.datasource.password=secret
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.jpa.generate-ddl=false
spring.jpa.hibernate.ddl-auto=none

JPA具有DDL生成功能,可以將這些功能設定為在資料庫啟動時執行。這是通過前兩個屬性控制的:

  • spring.jpa.generate-ddl (布林值)開啟和關閉功能,與供應商無關。
  • spring.jpa.hibernate.ddl-auto(列舉)是一種Hibernate功能,它以更細粒度的方式控制行為。這個特點是:create,create-drop,validate,和update。

在生產中使用Flyway版本控制時,強烈建議您使用none或僅指定此屬性。

這是我們的Person實體:

@Entity
class Person {

  @Id
  @GeneratedValue(strategy=AUTO)
  Long id

  @Column(nullable = false)
  String firstname

  @Column(nullable = false)
  String lastname

}

原始碼下載

 

相關文章