Control de versiones de la estructura de la base de datos con Liquibase

La mayoría de las aplicaciones con las que me he encontrado almacenan datos en una base de datos SQL. Si tiene una aplicación corporativa, lo más probable es que haya varios stands: un stand de desarrollo, pre-prod y prod. Y un equipo de desarrolladores está trabajando en la aplicación.





Estas aplicaciones enfrentan el problema de sincronizar el esquema de la base de datos entre los circuitos y los propios desarrolladores. Es necesario transferir de alguna manera los cambios que realizó a todos los demás y, al mismo tiempo, no generar conflictos.





Estos problemas se resuelven con el sistema de gestión de migración Liquibase. Es una especie de sistema de control de versiones para su base de datos.





Liquibase es una biblioteca independiente de base de datos para rastrear, administrar y aplicar cambios a un esquema de base de datos.





Los cambios de la base de datos se registran en un formato comprensible para Liquibase y, a su vez, ejecuta consultas a la base de datos. Por lo tanto, se logra la independencia de una base de datos específica. Liquibase admite 10 tipos de bases de datos, incluidos DB2, Apache Derby, MySQL, PostgreSQL, Oracle, Microsoft® SQL Server, Sybase y HSQL. Puede encontrar una lista de todas las bases de datos compatibles en el sitio web .





Existen otros sistemas de gestión de migraciones: migraciones de Doctrine 2, migraciones de Rails AR, DBDeploy, etc. Pero algunos de ellos dependen de la plataforma, otros no tienen una funcionalidad tan amplia.





— , , : drop + add, .





Liquibase

Liquibase — Java , , JAR Windows, Mac Linux.





spring-boot PostgresSQL . , liquibase .jar . :





java -jar liquibase.jar --driver=com.mysql.jdbc.Driver--classpath=lib/mysql-connector-java-5.1.21-bin.jar --changeLogFile=/path/to/changelog.yaml --url="jdbc:mysql://localhost/application" --username=dbuser --password=secret update
      
      



Changelog

, changelog. : XML, YAML, JSON SQL.





. .





XML , .





ChangeSet

ChangeSet – , Git. ChangeSet . ChangeSet.





changeSet id



, author



filename



, .





Liquibase :





  • databasechangelog



    – . changeSet.





  • databasechangelock



    – , Liquibase.





Liquibase , . , , Liquibase .





Liquibase databasechangelock



, boolean locked



. Liquibase , true



, false



.





, Liquibase , false



. :





base-de-datos-bloqueada.jpg
locked-database.jpg

, databasechangelock



locked



false



.





databasechangelock.jpg
databasechangelock.jpg

Liquibase changelog, , .





changeSet databasechangelog



MD5 changeSet. XML.





Liquibase , . changeSet, , .





error-md5.jpg
error-md5.jpg

changeset





spring-boot , Liquibase.





GitHub:

https://github.com/Example-uPagge/liqubase





spring-boot

Liquibase, maven:





<dependency>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-core</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
      
      



application.yml



:





spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/liquibase_example
    username: postgres
    driver-class-name: org.postgresql.Driver
    password: password
      
      



Hibernate, .





changelog. spring-boot Liquibase resources/db/changelog/db.changelog-master.yml



. XML .





resources/db/changelog/db.changelog-master.xml



. application.yml



:





spring:
  # .. .. .. .. ..
  liquibase:
    change-log: classpath:db/changelog/db.changelog-master.xml
      
      



:





<databaseChangeLog
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

    //   changeSets

</databaseChangeLog>
      
      



, changeSet , .





Person.





<changeSet id="create-table-person" author="uPagge">
    <createTable tableName="person">
        <column name="id" type="int" autoIncrement="true">
            <constraints nullable="false" primaryKey="true"/>
        </column>
        <column name="name" type="varchar(64)"/>
        <column name="telegram_id" type="int">
            <constraints unique="true"/>
        </column>
    </createTable>
</changeSet>
      
      



createTable



tableName



, . , .





. Liquibase, .





id. , constraints



:





  • primaryKey="true"



    – .





  • nullable="false"



    – NULL.





    primaryKey nullable . H2 , - .





spring-boot 3 , person



.





changeSet. :





<changeSet id="create-table-person" author="uPagge">
  <createTable tableName="person">
    <column name="id" type="int" autoIncrement="true">
      <constraints nullable="false" primaryKey="true"/>
    </column>
    <column name="name" type="varchar(64)"/>
    <column name="telegram_id" type="int">
      <constraints unique="true"/>
    </column>
    <column name="address" type="varchar(300)"/>
  </createTable>
</changeSet>
      
      



.





changeSet , databasechangelog



, changeSet. git .





:





  • changeSet . []





  • Liquibase.





  • changeSet databasechangelog



    . , changeSet - . .





changeSet :





<changeSet id="create-table-person" author="uPagge">
    <createTable tableName="person">
        <column name="id" type="int" autoIncrement="true">
            <constraints nullable="false" primaryKey="true"/>
        </column>
        <column name="name" type="varchar(64)"/>
        <column name="telegram_id" type="int">
            <constraints unique="true"/>
        </column>
    </createTable>
</changeSet>

<changeSet id="add-new-column-address" author="uPagge">
    <addColumn tableName="person">
        <column name="address" type="varchar(300)"/>
    </addColumn>
</changeSet>
      
      



. , .





add-new-column-success.jpg
add-new-column-success.jpg

. Book



Person



. changeSet:





<changeSet id="create-table-book" author="uPagge">
    <createTable tableName="book">
        <column name="id" type="int" autoIncrement="true">
            <constraints nullable="false" primaryKey="true"/>
        </column>
        <column name="name" type="varchar(64)"/>
        <column name="author_id" type="int">
            <constraints foreignKeyName="book_author_id_person_id" references="person(id)"/>
        </column>
    </createTable>
</changeSet>
      
      



author_id



id



Person



.





foreignKeyName



. : _ + _ + __ + ___.





:





<constraints foreignKeyName="book_author_id_person_id" references="person(id)" deleteCascade="true"/>
      
      



, , .





, :





<changeSet id="create-table-book" author="uPagge">
    <createTable tableName="book">
        <column name="id" type="int" autoIncrement="true">
            <constraints nullable="false" primaryKey="true"/>
        </column>
        <column name="name" type="varchar(64)"/>
        <column name="author_id" type="int"/>
    </createTable>

    <addForeignKeyConstraint baseTableName="book" baseColumnNames="author_id"
                             constraintName="book_author_id_person_id"
                             referencedTableName="person" 
                             referencedColumnNames="id" 
                             onUpdate="CASCADE"/>
</changeSet>
      
      



, XML, SQL:





<changeSet id="create-view-book-author" author="uPagge">
    <createView viewName="author_and_book">
        SELECT p.id as person_id, 
               p.name as person_name, 
               b.id as book_id, 
               b.name as book_name
        FROM person p
                 LEFT JOIN book b on p.id = b.author_id
    </createView>
</changeSet>
      
      



Liquibase 2017. Liquibase , .





changeSet, SQL. , .





ChangeSet

changeSet changelog : . , , changeSet.





ChangeLog . changelog.





:





  • db/changelog



    . , v.1.0.0



    .





  • -. cumulative.xml



    .





  • , changelog cumulative.xml



    .





  • db.changelog-master.xml



    cumulative.xml



    .





, changeSet. changeLogs changeLogs .





, , id



changeSet.





, :





  • changelog, cumulative.xml



    , , . : 2020-03-08-create-tables.xml







  • id



    changeSet. id="2020-03-08-create-table-person"



    .





Liquibase . Liquibase.





  • - , .





  • , .





XML

«» XML, DSL: groovy, yaml, json.





, :





  • IDE









remark

, . remark



.





<changeSet id="2021-02-22-create-person" author="uPagge">
    <createTable tableName="person" remarks=" ">
        <column name="id" type="int" autoIncrement="true" remarks="">
            <constraints nullable="false" primaryKey="true"/>
        </column>
        <column name="name" type="varchar(64)" remarks=" ">
            <constraints nullable="false"/>
        </column>
        <column name="telegram" type="int" remarks="  ">
            <constraints unique="true"/>
        </column>
    </createTable>
</changeSet>
      
      



: Liquibase.





Liquibase, . , Liquibase.





, .








All Articles