使用Flyway做数据库变更版本控制

使用Flyway做数据库变更版本控制

前言

在DevOps部署流水线中,需要对数据库变更做版本控制,要求能够做到:

  • 对数据库变更做版本控制
  • 执行数据库增量变更,包括执行DDL和DML语句
  • 防止重复执行
  • 一次编写SQL,多环境运行

Flyway介绍

Flyway 是一个简单而强大的数据库变更版本控制工具。

Flyway支持通过.sql文件来对数据库变更脚本做版本控制,.sql文件的命名规范为

V{version}__{description}.sql
  • 大写的V表示该脚本为Flyway Versioned Migration Script
  • version为递增的数据库变更脚本版本号
  • __两个下划线用来分隔version和description
  • description为脚本描述

Flyway通过在数据库中创建flyway_schema_history表来记录数据库变更历史,并防止重复执行脚本和检查之前检查过的脚本是否被篡改。

flyway_schema_hisotry

Flyway支持与Maven和Gradle集成,使得可以不用安装其它工具,就可以在项目中直接使用Flyway来做数据库变更版本控制。

使用Flyway对Spring Boot项目做数据库变更版本控制

下面介绍在Spring Boot项目(用Maven管理依赖)中如何通过Flyway来做数据库变更版本控制。

pom.xml文件中添加Flyway的依赖:

<dependency>
	<groupId>org.flywaydb</groupId>
	<artifactId>flyway-core</artifactId>
</dependency>

在Spring Boot的配置文件(比如application.properties)中配置Flyway的属性:

# 默认flyway.enabled=true
flyway.enabled=true
# 默认flyway.locations=classpath:db/migration
flyway.locations=classpath:db/migration

Flyway默认使用和Spring Boot相同的数据库连接。

完整的Flyway的属性参见文末的Flyway properties

src/main/resources目录下创建db/migration目录,并将.sql文件放在该目录下。

.sql文件需要符合上面提到的Flyway命名规范。

在Spring Boot程序运行时,会通过Flyway自动在数据库中创建flyway_schema_history表来记录数据库变更历史,并自动执行数据库变更脚本。

完整的示例代码参见flyway-demo

结合Spring的profile注入功能,可以控制某些.sql文件只在特定环境的数据库中执行。

后记

Liquibase也可以实现和Flyway一样的数据库变更版本控制功能。关于这两者的区别,请参考下面这篇文章:

参考文档

附录

Flyway properties

# The description to tag an existing schema with when executing baseline.
flyway.baseline-description=
# Version to start migration.
flyway.baseline-version=1
# Whether to execute migration against a non-empty schema with no metadata table
flyway.baseline-on-migrate=false
# Check that migration scripts location exists.
flyway.check-location=false
# will clean all objects. Warning! Do NOT enable in production!
flyway.clean-on-validation-error=false
# Enable flyway.
flyway.enabled=true
# The encoding of migrations.
flyway.encoding=UTF-8
# Ignore future migrations when reading the metadata table.
flyway.ignore-failed-future-migration=true
# SQL statements to execute to initialize a connection immediately after obtaining it.
flyway.init-sqls= 
# locations of migrations scripts.
flyway.locations=classpath:db/migration
# Allows migrations to be run "out of order".
flyway.out-of-order=false
# The prefix of every placeholder.
flyway.placeholder-prefix=
# Whether placeholders should be replaced.
flyway.placeholder-replacement=true
# The suffix of every placeholder.
flyway.placeholder-suffix=}
# Placeholders to replace in Sql migrations.
flyway.placeholders.*=
# Default schema of the connection and updating
flyway.schemas=
# The file name prefix for Sql migrations
flyway.sql-migration-prefix=V
# The file name separator for Sql migrations
flyway.sql-migration-separator=__
# The file name suffix for Sql migrations
flyway.sql-migration-suffix=.sql
# The name of Flyway's metadata table.
flyway.table=schema_version
# JDBC url of the database to migrate. If not set, the primary configured data source is used.
flyway.url=
# Login user of the database to migrate. If not set, use spring.datasource.username value.
flyway.user=
# JDBC password if you want Flyway to create its own DataSource.
flyway.password=
# Validate sql migration CRC32 checksum in classpath
flyway.validate-on-migrate=true.
nklinsirui CSDN认证博客专家 DevOps
DevOps的实践者和布道者。
现在某国际开源软件公司担任高级专家顾问。
曾在某电子政务公司担任高级系统架构师。
曾在某国际咨询公司担任技术架构交付经理。
曾在某跨国银行中国软件开发中心担任高级专家顾问。
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页