[JAVA] Spring with Kotorin ―― 9. Migration de base de données ―― Flyway

Aperçu / Description

La plupart des applications Web utilisent des bases de données pour interroger et stocker des données. Par conséquent, nous avons précédemment implémenté une couche dans l'application qui est responsable de la connexion à la base de données.

En revanche, la mise en page de la base de données change généralement à mesure que l'application se développe. Il est peu probable que cela ne change pas par rapport à la conception initiale. Par conséquent, il est important de gérer l'état de la base de données.

Je pense que le code source de l'application est géré en version par des outils de gestion tels que Git. L'outil (framework) utilisé pour la version de l'état de la base de données de la même manière est ** Flyway ** utilisé cette fois.

flyway-logo-tm.png

Hypothèse / environnement

Version d'exécution

Spring Dependencies

Environnement de développement

Procédure / Explication

Dépendance ajoutée

Tout d'abord, modifiez les fichiers de définition respectifs pour Gradle (build.gradle) ou Maven ( pom.xml) et ajoutez la dépendance Flyway.

dependencies {
	implementation('org.flywaydb:flyway-core')
}

--Pour Maven (pom.xml)

<dependency>
	<groupId>org.flywaydb</groupId>
	<artifactId>flyway-core</artifactId>
</dependency>

De plus, si vous souhaitez utiliser Spring Initializr lorsque vous créez un projet Spring pour la première fois, vous pouvez ajouter Flayway dans l'élément Dependencies comme indiqué ci-dessous. Est possible.

flyway-initilizr.png

Description de la définition de connexion à la base de données

Définissez la définition de connexion de la base de données à migrer par Flyway et les paramètres liés au comportement de Flyway dans ʻapplication.yml` (ou applicatation.properties).

  flyway:
    enabled: true
    url: jdbc:h2:mem:app;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=TRUE
    schemas: PUBLIC
    user: guest
    password: guest
    baseline-on-migrate: true
    baseline-version: 1.0.0
    baseline-description: Initial
    locations: classpath:db/migration
article La description
enabled Si Flyway peut être exécuté
Par défaut: vrai(Exécuter)
url Chaîne de connexion à la base de données à migrer
schemas Schéma cible
Le schéma par défaut de H2DB ciblé cette fois estPUBLICDésigné pour(Sensible à la casse et en majuscules)
user/password ID utilisateur de connexion à la base de données/mot de passe
baseline-on-migrate S'il faut démarrer la version d'exécution du script de migration Flyway au milieu
Valeur par défaut: faux(Tout est fait depuis la première version)
baseline-version baseline-on-Version à démarrer si migrate est vrai
baseline-description baseline-Commentaires enregistrés lors de la mise en œuvre dans la version
locations Emplacement du script de migration
classpath:Spécifiez un emplacement sur le chemin de classe
filepath:Spécifiez un répertoire sur le système de fichiers

Référence: Commande Flyway Migrate [^ 1]

Placement du script de migration de base de données

Flyway exécute automatiquement le SQL placé en fonction des règles déterminées et exécute la migration. Et par défaut, l'emplacement du script sera le répertoire suivant créé sous src / main / resources.

db-migration-dir.png

Les fichiers SQL placés dans db / migration doivent avoir des noms de fichiers qui suivent les conventions de dénomination reconnues par Flyway. La convention de dénomination est la suivante.

article La description
PREFIX La valeur par défaut estV
Flyway scanne et exécute les fichiers commençant par V
flyway.sqlMigrationPrefixPropriétésapplication.ymlPeut être défini et changé en
VERSION Point(.)Ou souligner(_)Peut séparer la version majeure et la version mineure avec
La version doit commencer à 1
DESCRIPTION Élément pour la notation de description
Exprimez facilement les changements dans la version correspondante

Exemple: V1.0.0_my_first_flyway.sql

Création d'un script de migration de base de données

V1.0.0-Créer une table

Définissez d'abord le DDL qui crée la table.

CREATE TABLE message (
    id VARCHAR(36) NOT NULL PRIMARY KEY,
    title VARCHAR(255),
    message VARCHAR(255),
    created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

Exécutez l'application.

$ ./gradlew clean bootRun

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.1.RELEASE)
  :
  :
2019-03-28 13:26:52.822  INFO 7128 --- [           main] o.f.c.internal.license.VersionPrinter    : Flyway Community Edition 5.2.4 by Boxfuse
2019-03-28 13:26:53.118  INFO 7128 --- [           main] o.f.c.internal.database.DatabaseFactory  : Database: jdbc:h2:mem:app (H2 1.4)
2019-03-28 13:26:53.254  INFO 7128 --- [           main] o.f.core.internal.command.DbValidate     : Successfully validated 1 migration (execution time 00:00.018s)
2019-03-28 13:26:53.280  INFO 7128 --- [           main] o.f.c.i.s.JdbcTableSchemaHistory         : Creating Schema History table: "PUBLIC"."flyway_schema_history"
2019-03-28 13:26:53.329  INFO 7128 --- [           main] o.f.core.internal.command.DbMigrate      : Current version of schema "PUBLIC": << Empty Schema >>
2019-03-28 13:26:53.331  INFO 7128 --- [           main] o.f.core.internal.command.DbMigrate      : Migrating schema "PUBLIC" to version 1.0.0 - Create-InitialTable
2019-03-28 13:26:53.358  INFO 7128 --- [           main] o.f.core.internal.command.DbMigrate      : Successfully applied 1 migration to schema "PUBLIC" (execution time 00:00.089s)
  :
  :

Depuis le journal de démarrage, vous pouvez voir que le processus de création de table de Flyway Migrer le schéma" PUBLIC "vers la version 1.0.0 --Create-InitialTable a été effectué.

De plus, si vous vérifiez la console H2DB comme indiqué ci-dessous, vous pouvez voir que le traitement de 1.0.0 est enregistré dans le tableau d'historique Flyway comme indiqué ci-dessous.

flyway_1_0_0.png

V1.1.0-Ajouter des données

Ensuite, définissez le SQL qui ajoute des données à la table créée.

INSERT INTO message(id, title, message) VALUES ('7b23257c-e9d9-4d1e-ba79-01f8b8715ba9', 'INIT', 'Inserted by FLYWAY');

INSERT INTO message(id, title, message) VALUES ('12345678-e9d9-4d1e-ba79-01f8b8715ba9', 'INIT', 'Inserted by FLYWAY');

Exécutez l'application comme avant.

$ ./gradlew clean bootRun

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.1.RELEASE)
  :
  :
2019-03-28 13:43:30.226  INFO 7430 --- [           main] o.f.c.internal.license.VersionPrinter    : Flyway Community Edition 5.2.4 by Boxfuse
2019-03-28 13:43:30.431  INFO 7430 --- [           main] o.f.c.internal.database.DatabaseFactory  : Database: jdbc:h2:mem:app (H2 1.4)
2019-03-28 13:43:30.588  INFO 7430 --- [           main] o.f.core.internal.command.DbValidate     : Successfully validated 2 migrations (execution time 00:00.029s)
2019-03-28 13:43:30.617  INFO 7430 --- [           main] o.f.c.i.s.JdbcTableSchemaHistory         : Creating Schema History table: "PUBLIC"."flyway_schema_history"
2019-03-28 13:43:30.658  INFO 7430 --- [           main] o.f.core.internal.command.DbMigrate      : Current version of schema "PUBLIC": << Empty Schema >>
2019-03-28 13:43:30.659  INFO 7430 --- [           main] o.f.core.internal.command.DbMigrate      : Migrating schema "PUBLIC" to version 1.0.0 - Create-InitialTable
2019-03-28 13:43:30.694  INFO 7430 --- [           main] o.f.core.internal.command.DbMigrate      : Migrating schema "PUBLIC" to version 1.1.0 - Insert-InitialData
2019-03-28 13:43:30.713  INFO 7430 --- [           main] o.f.core.internal.command.DbMigrate      : Successfully applied 2 migrations to schema "PUBLIC" (execution time 00:00.107s)

Vous pouvez confirmer que le script de migration ajouté est en cours d'exécution à partir du journal de démarrage.

Si vous vérifiez la console H2DB, vous pouvez voir dans le tableau d'historique que deux processus de migration ont été exécutés.

flyway_1_1_0.png

De plus, si vous interrogez la table MESSAGE créée, vous pouvez voir que le SQL défini comme script de migration est reflété et les données sont ajoutées.

flyway_1_1_0-select-data.png

Résumé / Rétrospective

Migration-1-2.png

Lors du développement d'une application, la disposition de la base de données a tendance à changer fréquemment et le travail tel que l'enregistrement des données qui l'accompagne a tendance à se produire fréquemment. Il est également nécessaire de gérer le moment où la mise en page est modifiée (exigences). Si vous gérez la base de données à l'aide de ce Flyway, vous pouvez réduire le temps et les efforts d'un tel travail.

Cette source

Recommended Posts

Spring with Kotorin ―― 9. Migration de base de données ―― Flyway
Printemps avec Kotorin ―― 1. INITIALISATION PRINTEMPS
Spring with Kotorin --8 Repository layer --Supplément: H2 Database
Essayez d'automatiser la migration avec Spring Boot Flyway
Spring with Kotorin --- 8. Couche de référentiel
Spring avec Kotorin --6 Traitement asynchrone
Ressort avec Kotorin ―― 7. Couche de service
Spring avec Kotorin - 4 Conception d'API REST
J'ai essayé Flyway avec Spring Boot
Ressort avec Kotorin ―― 3. Omettre les crochets d'onde de la fonction
[Java] Migration de bases de données (Flyway)
Validation personnalisée avec Spring
Création d'un environnement de base de données avec Docker dans Spring Boot (IntellJ)
Avec Kotorin ―― 7. Fonction de cadrage
Télécharger avec Spring Boot
Connectez-vous à la base de données avec spring boot + spring jpa et effectuez l'opération CRUD
Générer un code à barres avec Spring Boot
Hello World avec Spring Boot
Configuration Java avec Spring MVC
Démarrez avec Spring Boot
Bonjour tout le monde avec Spring Boot!
Exécutez LIFF avec Spring Boot
Connexion SNS avec Spring Boot
Fonction de connexion avec Spring Security
Utilisation de Mapper avec Java (Spring)
Spring Boot à partir de Docker
Erreur de connexion à la base de données Spring
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
Lier l'API avec Spring + Vue.js
Créer un micro service avec Spring Boot
Envoyer du courrier avec Spring Boot
Coexistence de Flyway dans la base de données embarquée (h2) de l'environnement de développement et la base de données des versions (SQL Server) avec Spring Boot