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.
Spring Dependencies
Tout d'abord, modifiez les fichiers de définition respectifs pour Gradle (build.gradle
) ou Maven ( pom.xml
) et ajoutez la dépendance Flyway.
build.gradle
)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.
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 est PUBLIC Dé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 migrationclasspath: Spécifiez un emplacement sur le chemin de classefilepath: Spécifiez un répertoire sur le système de fichiers |
Référence: Commande Flyway Migrate [^ 1]
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
.
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.sqlMigrationPrefix Propriétésapplication.yml Peut ê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
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.
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.
Migrating schema "PUBLIC" to version 1.0.0 - Create-InitialTable
Migrating schema "PUBLIC" to version 1.1.0 - Insert-InitialData
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.
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.
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.
Recommended Posts