Dans cet article, je vais discuter de l'utilisation de l'utilitaire
Liquibase dans les applications Spring Boot pour
versionner la structure d'une base de données relationnelle et migrer cette structure d'une version à une autre. Dans la première partie, nous analyserons l'exemple de base, et dans la seconde, nous parlerons de l'utilisation de
liquibase-mave-plugin pour
annuler les modifications et générer automatiquement des scripts en comparant les structures de base de données.
Commençons par créer l'application la plus simple sur Spring Boot + JPA (Hibernate). Le
Spring Initializr nous y aidera. Dans les dépendances, sélectionnez JPA, MySQL et Web. Liquibase peut également être connecté à cette étape, mais pour une meilleure compréhension, nous le ferons plus tard manuellement.
Créer la base de l'application
Nous ajoutons une classe d'entité à notre application, ainsi qu'un référentiel et un contrôleur REST pour travailler avec. Pour être concret, nous allons stocker des informations sur les utilisateurs dans l'entité créée.
@Entity @Table(name = "users") public class User implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Long id; @Column(name = "username", unique = true, nullable = false) private String userName; @Column(name = "password", nullable = false) private String password; @Column(name = "first_name") private String firstName; @Column(name = "last_name") private String lastName; @Column(name = "email") private String email;
Spring Data rend le code du référentiel extrêmement concis
public interface UserRepository extends JpaRepository<User, Long> { }
Contrôleur REST qui affichera tout le contenu de la table utilisateur
@RestController public class UserController { private UserRepository userRepository; @Autowired public UserController(UserRepository userRepository) { this.userRepository = userRepository; } @GetMapping("/user/all") public List<User> allUsers() { return userRepository.findAll(); } }
Paramètres dans le fichier
application.properties spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/geek_db?createDatabaseIfNotExist=true&allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC spring.datasource.username=dbuser spring.datasource.password=dbpassword spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
Il est supposé que votre ordinateur exécute un serveur MySQL sur un port standard. Si nécessaire, ajustez l'URL du serveur dans la chaîne de connexion, ainsi que le nom d'utilisateur et le mot de passe. Il convient également de prêter attention au paramètre
createDatabaseIfNotExist . Grâce à lui, lors de la connexion, nous créerons une base de données appelée
geek_db si elle n'est pas sur le serveur.
Ajouter Liquibase
Vous avez sûrement remarqué qu'il
manque un paramètre pour Hibernate, à savoir
spring.jpa.hibernate.ddl-auto . Dans la plupart des manuels pour débutants, la valeur de
mise à jour est indiquée pour cela, en raison de laquelle Hibernate créera et ajustera la structure de la table sur le serveur lui-même, en fonction des classes d'entités présentes dans le projet. Cette approche peut très bien être utilisée si le schéma de données est très simple ou si le projet est en cours de formation, mais avec un schéma quelque peu compliqué, des problèmes vont très probablement commencer, ne serait-ce que parce que nous ne pouvons pas contrôler le processus de génération des scripts DDL Hibernate. Un autre problème est qu'avec cette approche, il n'y a pas de moyen facile d'annuler les modifications apportées à Hibernate dans la structure de la base de données.
C'est pour résoudre les problèmes ci-dessus que nous utiliserons l'utilitaire
Liquibase . Heureusement pour nous, elle est parfaitement capable de s'intégrer aux applications Spring Boot! Pour commencer à l'utiliser, vous devez effectuer les étapes suivantes
Ajoutez le paramètre au fichier
application.properties spring.jpa.hibernate.ddl-auto=none
Il s'agit de s'assurer qu'Hibernate ne prend aucune mesure pour modifier le circuit, comme Liquibase les fera maintenant. Théoriquement, vous pouvez également utiliser ici la valeur de
validation pour un contrôle supplémentaire sur l'exactitude de la structure de la table.
Ajouter une dépendance à
pom.xml <dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> </dependency>
Après l'avoir ajouté, Spring Boot créera automatiquement un bean spécial nommé liquibase, qui effectuera toutes les actions pour configurer le schéma de base de données basé sur les scripts Liquibase à chaque démarrage de l'application.
Vous devez maintenant ajouter le script Liquibase lui-même, ce qui créera la table dont nous avons besoin. Dans le dossier / src / main / resources / db / changelog, créez un fichier appelé db.changelog-master.yaml et ajoutez-y le contenu suivant
databaseChangeLog: - logicalFilePath: db/changelog/db.changelog-lesson1.yaml - changeSet: id: 1 author: your_liquibase_username changes: - createTable: tableName: users columns: - column: name: id type: BIGINT autoIncrement: true constraints: primaryKey: true nullable: false - column: name: username type: varchar(50) constraints: unique: true nullable: false - column: name: password type: varchar(512) constraints: nullable: false - column: name: first_name type: varchar(50) - column: name: last_name type: varchar(50) - column: name: email type: varchar(50)
Analysons le contenu de ce script. Tout d'abord, il contient un changeSet. ChangeSet est un analogue d'une validation dans les systèmes de contrôle de version tels que Git ou SVN. Par analogie avec une validation, les modifications apportées dans le cadre d'un changeSet peuvent être annulées ou restaurées sur le serveur de base de données. Chaque changeSet doit avoir un identifiant unique avec lequel Liquibase détermine si un changeSet donné a été pompé vers cette base de données ou non.
ChangeSet contient une commande pour créer une table, et la structure de la table est décrite par Liquibase, et non un script SQL. Grâce à cela, ce fichier devient multiplateforme. Liquibase générera un script SQL en fonction du serveur de base de données utilisé. De plus, si nous devons annuler le changeSet donné, Liquibase pourra créer automatiquement un script pour supprimer la table donnée. Si nous utilisions des scripts SQL, nous devions alors écrire manuellement un script pour annuler les modifications. Dans la section des
suspensions , nous n'avons qu'une seule équipe, ce qui est considéré comme une bonne pratique, malgré le fait
qu'il peut
y avoir n'importe quel nombre d'équipes dans un même
changeSet .
Le code écrit suffit pour exécuter le programme, mais pour voir plus clairement les résultats de son travail, ajoutons un autre
changeSet , qui remplira le tableau de données.
- changeSet: id: 2 author: your_liquibase_username comment: "Create admin user" changes: - insert: tableName: users columns: - column: name: username value: "admin" - column: name: password value: "admin" - column: name: email value: "admin@server.com" - insert: tableName: users columns: - column: name: username value: "guest" - column: name: password value: "guest" - column: name: email value: "guest@server.com" rollback: - delete: tableName: users where: username in ('admin', 'guest')
Dans ce cas, nous devions déjà écrire manuellement un bloc pour les opérations de restauration, comme Liquibase ne peut pas créer automatiquement de restauration SQL lors de l'utilisation de données. En général, l'utilisation des données dans la base de données ne fait pas partie des principales fonctionnalités de Liquibase et se limite uniquement aux opérations les plus simples d'insertion, de suppression ou de modification. Au fait, si vous en avez besoin de plus, vous pouvez utiliser ici les outils de la société
Red Gate .
Et donc, exécutons notre application et essayons de suivre le lien
http: // localhost: 8080 / user / all . Si l'application a démarré, vous verrez une réponse JSON avec des informations sur les deux utilisateurs qui ont été ajoutés à la table. Il convient également de jeter un œil aux journaux de lancement des applications, dans lesquels vous pouvez voir les scripts exécutés par Liquibase pour initialiser la base de données. Une attention particulière doit être accordée à la table
DATABASECHANGELOG . C'est en elle que Liquibase stocke le journal des modifications apportées à la base de données.
C'est tout pour l'instant. Après un certain temps, je prévois de publier une suite sur l'utilisation du
plugin liquibase-maven pour générer automatiquement des scripts en comparant les structures de base de données et en annulant les modifications apportées.
Je serais reconnaissant pour tout ajout et commentaire!
Code complet PS écrit sur la base de cet article
github.com/usharik/spring-liquibase-demo/tree/part-1Suite à
habr.com/en/post/460907