共计 3484 个字符,预计需要花费 9 分钟才能阅读完成。
这篇文章主要介绍“怎么把数据库变更”,在日常操作中,相信很多人在怎么把数据库变更问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么把数据库变更”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!
经过千难万险的开发,系统终于上线了,进入了更加惊险刺激的捉虫阶段。在修修补补之中,给后人留下一堆屎山之前,我们需要把数据库给整利索了。
想想吧,我们在开发环境,修改了多个字段的名称,经历了测试环境的洗礼,还搞了个预上线接受变更。结果,仅仅在线上忘了操作其中一条 SQL,就前功尽弃。如果你做的是项目类型的工作,客户半年六个月才升级一次,这些脚本的管理就会乱上加乱。
我们需要把这些数据库变更,使用 git 这样的工具管理起来,在系统启动的时候,能够自动变更。通过口口相传,太不可信了。
谁也不想背这个锅。翻聊天记录? 有用么? 都是事后诸葛亮。
人和动物的区别,就是使用工具。经常被使用的两个,有 Liquibase 和 Flyway。但是,Liquibase 的迁移脚本写起来太复杂,需要花很多时间维护,远不如 Flyway 这样的开箱即用 (牺牲跨平台)。如果你的项目不是非常复杂,对 Liquibase 也不熟悉,建议直接选用 flyway。
一般,数据库变更,会有下面几种语句,我们都可以使用 flyway 来完成。
DDL 建表和索引的时候,用到的语句,比如 CREATE、ALTER、DROP 等
DML 就是一些常见的数据操作语句,比如 update、delete、insert
DCL 用来设置和管理权限方面信息的语句,比如 grant、deny、revoke 等
下面,就以 flyway 为例,来看一下数据库的版本,是如何变更的。
1. flyway migrate
首先,使用 mvn 的命令,创建一个示范项目。
mvn archetype:generate -B \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DarchetypeArtifactId=maven-archetype-quickstart \ -DarchetypeVersion=1.1 \ -DgroupId=foo \ -DartifactId=bar \ -Dversion=1.0-SNAPSHOT \ -Dpackage=foobar
在 pom.xml 文件中加入下面的内容:
build plugins plugin groupId org.flywaydb /groupId artifactId flyway-maven-plugin /artifactId version 7.3.1 /version configuration url jdbc:h3:file:./target/foobar /url user sa /user /configuration dependencies dependency groupId com.h3database /groupId artifactId h3 /artifactId version 1.4.200 /version /dependency /dependencies /plugin /plugins /build
创建数据库变更目录。
mkdir -p src/main/resources/db/migration
创建新的数据库文件,我们把它叫做第一个版本:src/main/resources/db/migration/V1__Create_person_table.sql
create table PERSON ( ID int not null, NAME varchar(100) not null );
使用 mvn 命令,即可完成数据库更新。不要怕,这个命令是幂等的。
mvn flyway:migrate
终端将输出下面的内容:
[INFO] Database: jdbc:h3:file:./target/foobar (H2 1.4) [INFO] Successfully validated 1 migration (execution time 00:00.009s) [INFO] Creating Schema History table: PUBLIC . flyway_schema_history [INFO] Current version of schema PUBLIC : Empty Schema [INFO] Migrating schema PUBLIC to version 1 - Create person table [INFO] Successfully applied 1 migration to schema PUBLIC (execution time 00:00.038s)
下面,我们准备第二个变更,同样的,我们创建第二版本的文件:src/main/resources/db/migration/V2__Add_people.sql
下面是 SQL 文件的内容:
insert into PERSON (ID, NAME) values (1, Axel insert into PERSON (ID, NAME) values (2, Mr. Foo insert into PERSON (ID, NAME) values (3, Ms. Bar
再次执行 mvn flyway:migrate,可以发现第二版本的 DML 信息,已经被写入到数据库。
2. 如何工作?
那 flyway 是如何做到幂等的呢? 我们使用 DBeaver 来打开这个 h3 文件。
在 JDBC 连接处,输入:jdbc:h3:/private/tmp/bar/target/foobar.mv.db; 然后选择 H2 Embedded 模式。我们发现,数据库中除了用户创建的 PERSON 表,还多了一个叫做 flyway_schema_history 的表。
让我们 see 一 see 里面的内容。使用 mvn flyway:info 命令,能看到相同的内容。
可以看到,这个幂等操作,其实是由一张自动创建的状态表,来保证的。里面还躺着一个叫做 checksum 的字段,李曼存储的是一个 CRC32 值,用来判断你的 SQL 文件是否经过了非法篡改 (篡改后将不予通过)。
捅破了这层窗户纸,一切神奇的事情忽然就变得豁然开朗。所以如果你想要用 flyway,你的账户,应该起码给 create table 的权限,否则你就需要手动建这种表。
从上面的 SQL 文件定义,也可以看出来,这些文件,需要遵循一定的规律。大体如上图所示,包含:
前缀
版本号
分隔符
版本描述
flyway 就是靠这种约定,来进行库表变更的。所以,要严格按照它的要求去命名 Sql 文件。
3. SpringBoot 项目集成
在 pom 中加入 flyway 的坐标。可以看到我们是没有提供版本号的,说明它已经在 bom 文件中定义过了。而它的 autoconfigure,在 SpringBoot 的 autoconfigure 包里面默认提供了。
dependencies dependency groupId org.flywaydb /groupId artifactId flyway-core /artifactId /dependency ... /dependencies
我们当然要看一下 FlywayProperties 这个文件所定义的配置项。可以看到它的前缀,就是 spring.flyway。
默认的 DB 变更文件,放在 classpath:db/migration,我们也可以通过 locations 配置自定义一个,比如 classpath:cn/xjjdog/flyway。当然,也可以通过 table 属性,定义那张 his 表的名称。url、user、password 这些,也可以提供,把 his 表存储在和业务表不一样的地方。如果不提供,将默认使用 datasource 所定义的库。
所以,最小配置,就是什么都不做,直接把变更文件,扔在变更目录下面就可以了。
spring: datasource: # jdbc 配置... flyway: enable: true locations: classpath:cn/xjjdog/flyway
到此,关于“怎么把数据库变更”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!