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
. :
, databasechangelock
locked
false
.
Liquibase changelog, , .
changeSet databasechangelog
MD5 changeSet. XML.
Liquibase , . changeSet, , .
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>
. , .
. 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.
, .