Verwenden von Liquibase zum Verwalten der Datenbankstruktur in einer Spring Boot-Anwendung. Teil 1

In diesem Artikel werde ich die Verwendung des Dienstprogramms Liquibase in Spring Boot-Anwendungen erlĂ€utern, um die Struktur einer relationalen Datenbank zu versionieren und diese Struktur von einer Version in eine andere zu migrieren. Im ersten Teil werden wir das grundlegende Beispiel analysieren und im zweiten Teil werden wir ĂŒber die Verwendung des Liquibase-Mave-Plugins sprechen, um Änderungen rĂŒckgĂ€ngig zu machen und Skripte automatisch zu generieren, indem wir Datenbankstrukturen vergleichen.

Beginnen wir mit der Erstellung der einfachsten Anwendung auf Spring Boot + JPA (Hibernate). Der Spring Initializr wird uns dabei helfen. WÀhlen Sie aus den AbhÀngigkeiten JPA, MySQL und Web aus. Liquibase kann auch in diesem Schritt verbunden werden, aber zum besseren VerstÀndnis werden wir dies spÀter manuell tun.

Erstellen Sie die Basis der Anwendung


Wir fĂŒgen unserer Anwendung eine EntitĂ€tsklasse sowie ein Repository und einen REST-Controller hinzu, um damit zu arbeiten. Der VollstĂ€ndigkeit halber speichern wir Benutzerinformationen in der erstellten EntitĂ€t.

@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; //    ,    //    Lombok } 

Spring Data macht den Repository-Code Ă€ußerst prĂ€zise

 public interface UserRepository extends JpaRepository<User, Long> { } 

REST-Controller, der den gesamten Inhalt der Benutzertabelle anzeigt

 @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(); } } 

Einstellungen in der Datei 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 

Es wird davon ausgegangen, dass auf Ihrem Computer ein MySQL-Server an einem Standardport ausgefĂŒhrt wird. Passen Sie gegebenenfalls die Server-URL in der Verbindungszeichenfolge sowie den Benutzernamen und das Kennwort an. Beachten Sie auch den Parameter createDatabaseIfNotExist . Dank dessen erstellen wir beim Verbinden eine Datenbank mit dem Namen geek_db, wenn sie sich nicht auf dem Server befindet.

Liquibase hinzufĂŒgen


Sicherlich haben Sie bemerkt, dass eine Einstellung fĂŒr den Ruhezustand fehlt , nĂ€mlich spring.jpa.hibernate.ddl-auto . In den meisten AnfĂ€ngerhandbĂŒchern wird der Aktualisierungswert dafĂŒr angegeben, wodurch Hibernate die Tabellenstruktur auf dem Server selbst basierend auf den im Projekt vorhandenen EntitĂ€tsklassen erstellt und anpasst. Dieser Ansatz kann durchaus verwendet werden, wenn das Datenschema sehr einfach ist oder das Projekt trainiert wird. Bei einem etwas komplizierten Schema treten jedoch höchstwahrscheinlich Probleme auf, schon allein deshalb, weil wir den Prozess der Generierung von Hibernate-DDL-Skripten nicht steuern können. Ein weiteres Problem besteht darin, dass es mit diesem Ansatz keine einfache Möglichkeit gibt, Änderungen an Hibernate in der Datenbankstruktur zurĂŒckzusetzen.

Um die oben genannten Probleme zu lösen, verwenden wir das Dienstprogramm Liquibase . Zum GlĂŒck kann sie sich perfekt in Spring Boot-Anwendungen integrieren! Um es zu verwenden, mĂŒssen Sie die folgenden Schritte ausfĂŒhren

FĂŒgen Sie die Einstellung der Datei application.properties hinzu

 spring.jpa.hibernate.ddl-auto=none 

Dies soll sicherstellen, dass Hibernate keine Maßnahmen ergreift, um die Schaltung zu Ă€ndern Liquibase wird sie jetzt tun. Theoretisch können Sie hier auch den Validierungswert verwenden, um die Richtigkeit der Tabellenstruktur zusĂ€tzlich zu steuern.

FĂŒgen Sie pom.xml eine AbhĂ€ngigkeit hinzu

 <dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> </dependency> 

Nach dem HinzufĂŒgen erstellt Spring Boot automatisch eine spezielle Bean mit dem Namen liquibase, die bei jedem Start der Anwendung alle Aktionen zum Konfigurieren des Datenbankschemas basierend auf Liquibase-Skripten ausfĂŒhrt.

Jetzt mĂŒssen Sie das Liquibase-Skript selbst hinzufĂŒgen, um die benötigte Tabelle zu erstellen. Erstellen Sie im Ordner / src / main / resources / db / changelog eine Datei mit dem Namen db.changelog-master.yaml und fĂŒgen Sie den folgenden Inhalt hinzu

 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) 

Lassen Sie uns den Inhalt dieses Skripts analysieren. ZunĂ€chst enthĂ€lt es ein changeSet. ChangeSet ist ein Analogon zu einem Commit in Versionskontrollsystemen wie Git oder SVN. In Analogie zu einem Commit können die Änderungen, die als Teil eines changeSet vorgenommen wurden, auf den Datenbankserver zurĂŒckgesetzt oder zurĂŒckgesetzt werden. Jedes changeSet muss eine eindeutige Kennung haben, mit der Liquibase bestimmt, ob ein bestimmtes changeSet in diese Datenbank gepumpt wurde oder nicht.

ChangeSet enthĂ€lt einen Befehl zum Erstellen einer Tabelle. Die Tabellenstruktur wird von Liquibase und nicht von einem SQL-Skript beschrieben. Dadurch wird diese Datei plattformĂŒbergreifend. Liquibase generiert abhĂ€ngig vom verwendeten Datenbankserver ein SQL-Skript. Wenn wir das angegebene changeSet zurĂŒcksetzen mĂŒssen, kann Liquibase außerdem automatisch ein Skript erstellen, um die angegebene Tabelle zu löschen. Wenn wir SQL-Skripte verwenden wĂŒrden, mĂŒssten wir manuell ein Skript schreiben, um die Änderungen zurĂŒckzusetzen. Im Bereich " Änderungen " haben wir nur ein Team. Dies wird als bewĂ€hrte Methode angesehen , obwohl in einem Änderungssatz eine beliebige Anzahl von Teams vorhanden sein kann .

Der geschriebene Code reicht aus, um das Programm auszufĂŒhren. Um die Ergebnisse seiner Arbeit klarer zu sehen, fĂŒgen wir ein weiteres changeSet hinzu , das die Tabelle mit Daten fĂŒllt.

  - 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') 

In diesem Fall mussten wir bereits manuell einen Block fĂŒr Rollback-Operationen schreiben, wie Liquibase kann beim Arbeiten mit Daten nicht automatisch Rollback-SQL erstellen. Im Allgemeinen gehört das Arbeiten mit Daten in der Datenbank nicht zu den Hauptmerkmalen von Liquibase und beschrĂ€nkt sich nur auf die einfachsten VorgĂ€nge zum EinfĂŒgen, Löschen oder Ändern. Übrigens, wenn Sie mehr brauchen, können Sie hier die Tools der Firma Red Gate verwenden .

Lassen Sie uns also unsere Anwendung ausfĂŒhren und versuchen, dem Link http: // localhost: 8080 / user / all zu folgen. Wenn die Anwendung gestartet wurde, wird eine JSON-Antwort mit Informationen zu den beiden Benutzern angezeigt, die der Tabelle hinzugefĂŒgt wurden. Es lohnt sich auch, einen Blick auf die Anwendungsstartprotokolle zu werfen, in denen Sie die Skripte sehen können, die Liquibase zum Initialisieren der Datenbank ausfĂŒhrt. Besondere Aufmerksamkeit sollte der Tabelle DATABASECHANGELOG gewidmet werden. Darin speichert Liquibase das Protokoll der an der Datenbank vorgenommenen Änderungen.

Das ist alles fĂŒr jetzt. Nach einiger Zeit plane ich, eine Fortsetzung ĂŒber die Verwendung des Liquibase-Maven-Plugins zu veröffentlichen, um automatisch Skripte zu generieren, indem Datenbankstrukturen verglichen und die vorgenommenen Änderungen rĂŒckgĂ€ngig gemacht werden.

FĂŒr ErgĂ€nzungen und Kommentare wĂ€re ich dankbar!

PS VollstÀndiger Code basierend auf diesem Artikel github.com/usharik/spring-liquibase-demo/tree/part-1

Fortsetzung unter habr.com/de/post/460907

Source: https://habr.com/ru/post/de460377/


All Articles