[JAVA] Essayez d'automatiser la migration avec Spring Boot Flyway

Suite de l'article précédent [Comment créer un environnement Docker avec Gradle pour intelliJ], définissez les paramètres pour créer automatiquement des tables dans la base de données au démarrage de l'application. Faire.

Dans l'article précédent, j'ai même créé une base de données appelée ** todo ** dans la base de données.

Vérifiez build.gradle

Vérifiez s'il y a ** flyway ** dans les plugins et ** flyway-core ** dans les dépendances.

build.gradle



plugins {
    id 'java'
    id 'org.springframework.boot' version '2.3.1.BUILD-SNAPSHOT'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'com.avast.gradle.docker-compose' version '0.12.1' 
    id 'org.flywaydb.flyway' version '6.4.3' //ici
}

// ...Abréviation

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.flywaydb:flyway-core' //ici
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'mysql:mysql-connector-java'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}

Créer application.yml

https://github.com/miyabayt/spring-boot-doma2-sample Les paramètres du référentiel sont utilisés tels quels. J'ai enlevé les pièces dont je n'ai plus besoin maintenant, comme doma.

applocation.yml


#Définir les paramètres communs
spring:
  profiles:
    #Spécifiez explicitement la valeur par défaut
    default: local
    active: local
  main:
    #Prise en charge temporaire de l'écrasement du Bean de DataValueProcessor
    allow-bean-definition-overriding: true
  messages:
    #Ensemble comprenant le chemin du fichier de définition de message
    basename: messages,ValidationMessages,PropertyNames
    cache-duration: -1
    encoding: UTF-8
  jackson:
    #Faire de la clé JSON une chaîne délimitée par un trait de soulignement
    property-naming-strategy: CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES
  thymeleaf:
    #Le mode HTML5 est obsolète, alors passez en mode HTML
    mode: HTML
  resources:
    #Mettre en cache le contenu statique
    cache:
      period: 604800
    chain:
      #Utilisez toutes les ressources qui sont GZiped
      compressed: true
      strategy:
        content:
          #Gestion des versions par valeur de hachage MD5 du contenu
          enabled: true
          paths: /**
  servlet:
    multipart:
      #Définir la limite de taille de téléchargement
      max-file-size: 5MB
      max-request-size: 5MB
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    hikari:
      autoCommit: false
      connectionTimeout: 30000
      idleTimeout: 30000
      maxLifetime: 1800000
      connectionTestQuery: SELECT 1
      minimumIdle: 10
      maximumPoolSize: 30
jmx:
  enabled: false
server:
  port: 18082 #Changé de 18081
  compression:
    enabled: true
  servlet:
    session:
      timeout: 7200
      #Ne pas afficher l'ID de session dans l'URL
      tracking-modes: cookie
    contextPath: /
logging:
  pattern:
    #Sortie de la valeur définie dans MDC
    level: "[%X{FUNCTION_NAME}:%X{X-Track-Id}:%X{LOGIN_USER_ID}] %5p"

#Paramètres de l'application
application:
  fileUploadLocation: build/todo #Changement de l'échantillon

Créer application-local.yml

Définissez les paramètres locaux. Ici, ajoutez les informations de la base de données docker créée dans l'article précédent. (Ceci fait partie de ** # change **)

url jdbc:mysql://127.0.0.1:[port]/[DB_name]?useSSL=false&characterEncoding=UTF-8 ** [port] ** est le nombre spécifié dans les ports dans docker-compose.yml ** [DB_name] ** est le nom de la table (MYSQL_DATABASE) spécifié dans l'environnement de docker-compose.yml

** nom d'utilisateur et mot de passe ** Nom d'utilisateur (MYSQL_ROOT_USER) et mot de passe (MYSQL_ROOT_PASSWORD) spécifiés dans l'environnement de docker-compose.yml

application-local.yml


#Paramètres locaux
spring:
  profiles: local
  messages:
    cache-duration: -1
  datasource:
    platform: mysql
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:33068/todo?useSSL=false&characterEncoding=UTF-8 #Changement
    username: root #Changement
    password: passw0rd #Changement
  resources:
    #Invalider le cache
    cache:
      period: 0
  flyway:
    enable: true
    baseline-on-migrate: true
    placeholder-replacement: false
logging:
  level:
    org.springframework: INFO
    org.springframework.jdbc: INFO
    org.thymeleaf: INFO
    com.example: DEBUG # com.Changement de l'échantillon

####
#Paramètres de l'application
application:
  fileUploadLocation: build/todo #Changement de l'échantillon
  cors:
    allowedHeaders: "Origin, X-Requested-With, Content-Type, Accept, X-XSRF-TOKEN"
    allowedMethods: "POST, GET, PUT, OPTIONS, DELETE"
    allowedOrigins: "*" #Spécifiez le nom de domaine qui autorise CORS

Créer un fichier SQL

Documentation Flyway-core Comme le dit la documentation, les fichiers SQL ont des conventions de dénomination. Cette fois, j'ai créé les deux fichiers sql suivants.

L'emplacement de stockage par défaut est resource> db> migraion.

R__0_create_tables.sql


CREATE TABLE IF NOT EXISTS users(
  user_id INT(11) NOT NULL AUTO_INCREMENT COMMENT 'Identifiant d'utilisateur'
  , first_name VARCHAR(40) NOT NULL COMMENT 'Nom'
  , last_name VARCHAR(40) NOT NULL COMMENT 'Nom de famille'
  , email VARCHAR(100) UNIQUE DEFAULT NULL COMMENT 'adresse mail'
  , password VARCHAR(100) DEFAULT NULL COMMENT 'mot de passe'
  , role VARCHAR(100) DEFAULT NULL COMMENT 'Autorité'
  , created_at DATETIME NOT NULL COMMENT 'Date d'enregistrement'
  , updated_by VARCHAR(50) DEFAULT NULL COMMENT 'changeur'
  , updated_at DATETIME DEFAULT NULL COMMENT 'Mettre à jour la date et l'heure'
  , deleted_by VARCHAR(50) DEFAULT NULL COMMENT 'Deleter'
  , deleted_at DATETIME DEFAULT NULL COMMENT 'Supprimer la date et l'heure'
  , version INT(11) unsigned NOT NULL DEFAULT 1 COMMENT 'Numéro de révision'
  , PRIMARY KEY (user_id)
  , KEY idx_users (email, deleted_at)
) COMMENT='utilisateur';

R__1_insert_datas.sql


INSERT INTO `users` VALUES
    (1,'Yamada','Hanako','[email protected]','passw0rd',NULL,NOW(),NULL,NULL,NULL,NULL,1),
    (2,'Suzuki','Taro','[email protected]','passw0rd',NULL,NOW(),NULL,NULL,NULL,NULL,1);

Le mot de passe n'est pas encodé ici, il reste donc tel quel. Je le ferai dans le prochain article.

Exécution de l'application

Ouvrez un terminal IntelliJ et exécutez ./gradlew bootRun.

$ ./gradlew bootRun

> Task :bootRun

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::  (v2.3.1.BUILD-SNAPSHOT)


...Abréviation

2020-06-13 22:15:41.439 [::]  INFO 78329 --- [io-18082-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 7 ms
<=========----> 75% EXECUTING [10m 10s]
> :bootRun

Si cela ressemble à ceci dans le terminal, c'est réussi. Le nombre après ** EXECUTING ** est l'heure de démarrage, il continuera donc à fonctionner.

Si l'affichage ci-dessous est affiché, il s'agit d'un échec, vérifiez donc l'erreur.

BUILD SUCCESSFUL in 5s
3 actionable tasks: 2 executed, 1 up-to-date

Vérifiez à l'intérieur de la table

[Article précédent](https://qiita.com/megumi_622/items/341cfbb684256e7c4dbc#%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE % E7% A2% BA% E8% AA% 8D) Entrez MySQL dans le conteneur et vérifiez le tableau.

Si l'utilisateur est enregistré comme indiqué ci-dessous, il réussit.

mysql> select * from users;
+---------+------------+-----------+---------------+-----------+------+----------------------+------------+------------+------------+------------+---------+
| user_id | first_name | last_name | email          | password | role | created_at           | updated_by | updated_at | deleted_by | deleted_at | version |
+---------+------------+-----------+---------------+-----------+------+----------------------+------------+------------+------------+------------+---------+
|       1 |Yamada|Hanako| [email protected] | passw0rd | NULL | 2020-06-13 22:05:03 | NULL       | NULL       | NULL       | NULL       |       1 |
|       2 |Suzuki|Taro| [email protected] | passw0rd | NULL | 2020-06-13 22:05:03 | NULL       | NULL       | NULL       | NULL       |       1 |
+---------+-----------+-------------+----------------+----------+------+---------------------+-----------+------------+-------------+------------+---------+
2 rows in set (0.01 sec)

La prochaine fois, nous créerons un ** écran de connexion **.

Recommended Posts

Essayez d'automatiser la migration avec Spring Boot Flyway
Essayez Spring Boot de 0 à 100.
Spring with Kotorin ―― 9. Migration de base de données ―― Flyway
J'ai essayé Flyway avec Spring Boot
Comment utiliser MyBatis2 (iBatis) avec Spring Boot 1.4 (Spring 4)
Comment utiliser h2db intégré avec Spring Boot
Essayez l'authentification LDAP avec Spring Security (Spring Boot) + OpenLDAP
[Java] Article pour ajouter une validation avec Spring Boot 2.3.1.
Je voulais classer la botte à ressort dans un multi-projet
Essayez d'afficher Hello World avec Spring + Gradle
[Introduction à Spring Boot] Fonction d'authentification avec Spring Security
Télécharger avec Spring Boot
Paramètres de connexion à MySQL avec Spring Boot + Spring JDBC
Mappez automatiquement DTO aux entités avec l'API Spring Boot
Essayez d'utiliser OpenID Connect avec Keycloak (application Spring Boot)
Essayez la loi de l'inversion des dépendances avec plusieurs projets Spring Boot
Comment démarrer par environnement avec Spring Boot de Maven
Tentative de SSR Vue.js avec Spring Boot et GraalJS
Essayez de travailler avec Keycloak en utilisant Spring Security SAML (Spring 5)
Générer un code à barres avec Spring Boot
Hello World avec Spring Boot
Implémenter GraphQL avec Spring Boot
Démarrez avec Spring Boot
Bonjour tout le monde avec Spring Boot!
Exécutez LIFF avec Spring Boot
Connexion SNS avec Spring Boot
Introduction à Spring Boot ① ~ DI ~
Téléchargement de fichiers avec Spring Boot
Spring Boot commençant par copie
Spring Boot à partir de Docker
Hello World avec Spring Boot
Définir des cookies avec Spring Boot
Utiliser Spring JDBC avec Spring Boot
Ajouter un module avec Spring Boot
Premiers pas avec Spring Boot
Introduction à Spring Boot, partie 1
Essayez d'utiliser Spring Boot Security
Essayez Spring Boot sur Mac
Créer un micro service avec Spring Boot
Envoyer du courrier avec Spring Boot
Sortez le journal d'accès Tomcat intégré à la sortie standard avec Spring Boot
Découpez SQL en fichier de propriété avec jdbcTemplate of spring boot
Jusqu'à INSERT et SELECT sur Postgres avec botte de printemps et feuille de thym
Essayez d'utiliser l'API de recherche de code postal avec Spring Boot
Connectez-vous à la base de données avec spring boot + spring jpa et effectuez l'opération CRUD
Flux jusqu'à la sortie des données de la table à afficher avec Spring Boot
J'ai essayé de démarrer avec Swagger en utilisant Spring Boot
Utiliser l'authentification de base avec Spring Boot
gRPC sur Spring Boot avec grpc-spring-boot-starter
Créez une application avec Spring Boot 2
Déploiement à chaud avec le développement Spring Boot
Liaison de base de données avec doma2 (Spring boot)
Comment configurer Spring Boot + PostgreSQL
Programmation Spring Boot avec VS Code
Jusqu'à "Hello World" avec Spring Boot
Créer une application d'enquête avec Spring Boot
Obtenez des résultats de validation avec Spring Boot
Créez une application avec Spring Boot
Comment utiliser ModelMapper (Spring boot)