数据库使用版本控制工具是至关重要的。在Flyway7.15版本中加入了对Halo的兼容,数据库结构与应用程序的演进和迭代同步非常重要。在本文中,我们将介绍如何使用 Flyway 这个强大的开源数据库版本控制工具来管理 Halo 数据库的版本迁移。通过使用 Flyway,您可以轻松地跟踪和应用数据库结构的变化,并确保整个团队的数据库环境始终保持一致。
一、Flyway的工作方式:
1、初始化:Flyway会创建一个用于存储元数据的特殊表(默认为"flyway_schema_history"),该表用于跟踪已应用的迁移。
2、配置:您需要配置Flyway以连接到目标数据库,并指定迁移脚本的位置、数据库方言等。
3、迁移脚本:编写迁移脚本,这些脚本描述了数据库结构的变更或数据的初始化/更新。迁移脚本可以使用SQL(如DDL、DML)编写,文件名必须按照特定的命名规则(例如,V1__create_user.sql)。
4、执行迁移:运行Flyway命令,触发数据库迁移过程。Flyway将扫描指定位置的迁移脚本,并按照严格的顺序逐个执行。
5、版本控制:Flyway会检查元数据表中记录的已应用迁移的版本号。对比迁移脚本的文件名与元数据表中的版本记录,Flyway确定哪些迁移脚本尚未应用,并依次执行它们。
6、应用迁移:在执行迁移脚本期间,Flyway会将每个脚本的内容发送到目标数据库,并记录已应用的迁移脚本的元数据。这些元数据包括迁移脚本的版本号、描述、应用日期等信息。
二、在springboot中使用
1、Flyway.jar包放入lib文件,在pom文件导入依赖。

2、application.properties文件配置
spring.datasource.url=jdbc:halo://10.17.17.220:1921/halo0rootspring.datasource.username=user1spring.datasource.password=123456spring.datasource.driver-class-name=com.halo.Driverspring.flyway.enabled=truespring.flyway.baseline-on-migrate=truespring.flyway.locations=classpath:migrationspring.flyway.sql-migration-prefix=Vspring.flyway.sql-migration-suffixes=.sqlspring.flyway.validate-on-migrate=truespring.flyway.table=flyway_schema_historyspring.flyway.clean-on-validation-error=truespring.flyway.repair=truespring.flyway.schemas=db1
3、编写迁移脚本
脚本的命名规范:
3.1、文件名前缀:迁移脚本的文件名必须以一个大写的"V"开始,表示版本(Version),后面紧跟着版本号,可以是一个或多个数字或字母。
3.2、版本号:版本号用于标识迁移脚本在执行顺序中的位置。它可以是一个简单的数字序列,也可以包含点号(.)和下划线(_)。通常,版本号遵循"主版本.次版本"的格式。

4、启动springboot项目
从日志上可以看到,已经成功执行了5个脚本。

查看数据库跟踪迁移记录表以及用户表都创建完毕。

5、在V1的迁移版本后追加脚本。
V1.1__create_student.sqlCREATE TABLE studentTest (id INT PRIMARY KEY,name VARCHAR(100) NOT NULL,age INT NOT NULL,sex int);V1.2__add_student.sqlINSERT INTO studentTest (id, name,age,sex) VALUES (1, 'kapu',23,'男');INSERT INTO studentTest (id, name,age,sex) VALUES (2, '小张',90,'男');V1.3__add_student.sqlINSERT INTO studentTest (id, name,age,sex) VALUES (3, 'jup',45,'女');INSERT INTO studentTest (id, name,age,sex) VALUES (3, '小红',10,'女');
增加迁移脚本后,启动程序。

应用启动日志显示已成功执行新增脚本操作,查看数据库的跟踪迁移记录表。

如果不希望使用追加迁移脚本,并且想要使用可重复调用的脚本。
以 “R” 开头的脚本通常被用于可重复迁移INSERT INTO studentTest (id, name,age,sex) VALUES (5, 'Current',45,'女');INSERT INTO studentTest (id, name,age,sex) VALUES (6, 'pot',30,'女');

"需要注意的是,已经成功执行的迁移脚本不应该被修改,否则可能会引发冲突并导致未知错误"
如下,修改了脚本中的字段类型引发的错误。

解决方法:
1、删除跟踪迁移记录表中脚本记录并重新执行。
2、为了确保修改的通顺性,应添加新的版本追加迁移脚本,而不是直接修改已有的迁移脚本。这样可以避免冲突并确保更新的顺序正确。
三、多数据源配置
1、application.properties文件增加多数据配置。
spring.datasource.primary.jdbc-url=jdbc:halo://10.17.17.220:1921/halo0rootspring.datasource.primary.username=user1spring.datasource.primary.password=123456spring.datasource.primary.driver-class-name=com.halo.Driverspring.flyway.enabled=truespring.flyway.primary.baseline-on-migrate=truespring.flyway.primary.locations=classpath:migrationspring.flyway.primary.sql-migration-prefix=Vspring.flyway.primary.sql-migration-suffixes=.sqlspring.flyway.primary.validate-on-migrate=truespring.flyway.primary.table=flyway_schema_historyspring.flyway.primary.clean-on-validation-error=truespring.flyway.primary.repair=truespring.flyway.primary.schemas=db1spring.datasource.secondary.jdbc-url=jdbc:halo://10.17.17.180:1922/testspring.datasource.secondary.username=testspring.datasource.secondary.password=testspring.datasource.secondary.driver-class-name=com.halo.Driverspring.flyway.secondary.baseline-on-migrate=truespring.flyway.secondary.locations=classpath:migration2spring.flyway.secondary.sql-migration-prefix=Vspring.flyway.secondary.sql-migration-suffixes=.sqlspring.flyway.secondary.validate-on-migrate=truespring.flyway.secondary.table=flyway_schema_historyspring.flyway.secondary.clean-on-validation-error=truespring.flyway.secondary.repair=truespring.flyway.secondary.schemas=sys
2、创建DataSourceConfig配置类,用于配置多数据源相关设置
@Configurationpublic class DataSourceConfig {@Primary@Bean(name = "primaryDataSource")@ConfigurationProperties(prefix = "spring.datasource.primary")public DataSource primaryDataSource() {return DataSourceBuilder.create().build();}@Primary@Bean(name = "secondaryDataSource")@ConfigurationProperties(prefix = "spring.datasource.secondary")public DataSource secondaryDataSource() {return DataSourceBuilder.create().build();}}
3、创建FlywayConfig配置类,关联数据源,配置flyway。
@Configurationpublic class FlywayConfig {@Autowired@Qualifier("primaryDataSource")private DataSource primaryDataSource;@Autowired@Qualifier("secondaryDataSource")private DataSource secondaryDataSource;@Bean(initMethod = "migrate")@DependsOn("primaryDataSource")public Flyway primaryFlyway() {return Flyway.configure().dataSource(primaryDataSource).locations("classpath:migration").schemas("db1").baselineOnMigrate(true).validateOnMigrate(true).load();}@Bean(initMethod = "migrate")@DependsOn("secondaryDataSource")public Flyway secondaryFlyway() {return Flyway.configure().dataSource(secondaryDataSource).locations("classpath:migration2").schemas("sys").baselineOnMigrate(true).validateOnMigrate(true).load();}}
4、编写不同数据源的迁移脚本

启动springboot项目

查看两个不同源数据库的跟踪迁移记录表以及用户表都创建完毕。
primaryDataSource数据源

secondaryDataSource数据源





