赞
踩
在频繁的工程实践中,服务端程序与数据库不断的更新,如果服务端和数据库部署不一致,经常性的会导致各种问题。为了解决这一问题,可行的方案之一就是让数据库随着服务端的版本而更新,flyway就是一种解决方案。
一. 目的 管理数据库更新。
二. 直接在java工程中嵌入sql脚本。工程重新部署时,会自动更新数据库,保证数据库与代码同步,避免了手动更新数据库带来的弊病。
flywaydb:主要是再第一次启动的时候创建flyway_schema_history表,然后去加载classpath下的文件进行执行,并且再表中记录加载的版本号记录。
之所以我需要在项目中使用它,注意是为了方便统一管理数据,由于我们项目初期,经常的变更数据库,如果要发布到测试环境,预发布等环境,有时候可能会漏掉sql未执行。
使用方式:
我们项目目前都是spring boot编写的,引入flywaydb 其实比较简单。
1.引入依赖:
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
springboot已经集成了flyway,加入依赖时并不需要添加版本号
2. 在你项目的resource下新建
在classpath:db/migration/mysql 目录下创建数据库脚本 (这个目录可以随便命名)
你需要升级的数据库脚本都放在这个下面
3. 在你的配置文件中配置 flywaydb 的信息:
spring:
application:
name: springboot-flyway
flyway:
enabled: true
# 禁止清理数据库表
clean-disabled: true
# 如果数据库不是空表,需要设置成 true,否则启动报错
baseline-on-migrate: true
# 与 baseline-on-migrate: true 搭配使用
baseline-version: 0
#数据库连接配置
url: ${spring.datasource.url}
user: ${spring.datasource.username}
password: ${spring.datasource.password}
locations:
- classpath:db/migration/mysql #(根据个人情况设置,多个路径使用逗号分隔)
#版本控制日志表,默认flyway_schema_history
table: flyway_schema_history
4.IDEA 中使用可以安装一个 flyway 的插件使用,sql文件有两种规则
第一种:versioned migration V<VERSION>__<NAME>.sql 首先是 V ,然后是版本号,如果版本号有多个数字,使用_分隔,比如1_0_0版本号的后面是 2 个下划线,最后是 SQL 脚本的名称。
第二种:Repeatable migration R<Repeatable>__<NAME>.sql 这个里面的sql每次项目启动都会执行。 例如:R__user.sql
这里需要注意:V 开头的只会执行一次,下次项目启动不会执行,也不可以修改原始文件,否则项目启动会报错,如果需要对 V 开头的脚本做修改,如果有个 SQL 脚本需要在每次启动的时候都执行,那么将 V 改为 R 开头即可。
使用flyway创建表后,就不要再去数据库手动改这张表的结构了,一切表的结构改动都用flyway,否则会影响修改记录,导致项目报错
上述两种情况的解决方案:找到flyway_schema_history表,删除对应的记录即可
我们项目中,我使用的是V开头的规则,项目启动会在数据库表中插入一条记录。只有启动一次原文件不能再被修改,否则启动会报错,如果又有新的脚本需要添加 可以重新新建一个文件。不建议直接去修改数据库中 flyway_schema_history的记录。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。