SpringBoot 实现SQL脚本自动执行


SpringBoot 实现配置SQL脚本自动执行
一. 背景
我们可能遇到过这种情况:

在公网开发时, 新增数据表非常容易, 直接登录到对应服务器的mysql / 使用Navicat访问mysql服务器. 然后去执行sql语句或脚本即可
在内网开发时, 由于都在一个网段, 所以操作也比较方便
但是在公网开发, 部署到别的内网环境. 上面的问题就变得非常麻烦.
由于内网环境处于安全考虑禁止外部设备接入.因此需要安装许多工具, 而且有的机器甚至禁用了远程连接(当然你也可以重新配置,但是后果自负). 而且由于各种原因. 负责部署的可能不是开发本人(实施或者是测试或运维人员). 而且每次部署的版本可能因为部署的地方部署的不同而不同, 因此到最后反而会因为SQL表的原因给开发自己徒增工作量.
因此我们需要考虑: Springboot 到底有没有自动执行SQL的功能?
答案是确定的, 而且解决方案不止一种

二. 使用方式
创建脚本
在项目的resource 目录下新建一个sql目录, 用于存放建表语句
然后在sql 目录下创建 xxx-schema.sql, xxx-data.sql 脚本. 需要注意区分每个后缀代表的含义:
schema: 代表存放的是DDL(数据库定义语言): 对表结构的增删改在这里
data: 代表存放的是DML(数据库操作语言): 对表中数据的操作在这里

 

 

在Springboot配置文件中配置
如果是 .properties, 则按如下配置

# 需要加上这句,否则不会自动执行sql文件
spring.datasource.initialization-mode=always
# schema.sql中一般存放的是建表语句DDL
spring.datasource.schema = classpath:/sql/xxx-schema.sql
# data.sql中一般存放的是需要插入更新等sql语句DML
spring.datasource.data =  classpath:/sql/xxx-data.sql
# 遇到错误继续执行
spring.datasource.data.continue-on-error: true

如果是 .yml 则按如下配置

spring:
  datasource:
    initialization-mode: always
    schema:
        - classpath:/sql/xxx-schema.sql
    data:
        - classpath:/sql/xxx-data.sql
    continue-on-error: true

正常启动项目即可

ps: 特别注意 spring.datasource.data.continue-on-error: true 配置

因为在没有加上这个配置之前, 每次初始化都会执行一遍配置的SQL脚本内的SQL语句.
如果在第一次启动并建表成功后再次重启就会因项目在启动时执行SQL脚本并出现表已存在的错误导致项目启动失败
添加该属性之后, 则会忽略错误, 让项目初始化成功! 这样, 也符合我们想要在项目初始化的时候自动执行SQL脚本的思想

三. 其他工具介绍
Flyway : 数据库版本控制管理工具
如果想要对mysql 进行更加细致的管理(版本管理), 可以通过整合 Flyway 来完成数据库部署和增量升级

Flayway是一款数据库版本控制管理工具,支持数据库版本自动升级,Migrations可以写成sql脚本,也可以写在java代码里;不仅支持Command Line和java api ,也支持Build构建工具和Spring boot,也可以在分布式环境下能够安全可靠安全地升级数据库,同时也支持失败恢复。
Flyway最核心的就是用于记录所有版本演化和状态的MetaData表,Flyway首次启动会创建默认名为SCHEMA_VERSION的元素局表。 表中保存了版本,描述,要执行的sql脚本等;

LiquiBase: 数据库重构和迁移的开源工具
LiquiBase是一个用于数据库重构和迁移的开源工具,通过日志文件的形式记录数据库的变更,然后执行日志文件中的修改,将数据库更新或回滚到一致的状态。它的目标是提供一种数据库类型无关的解决方案,通过执行schema类型的文件来达到迁移。

支持几乎所有主流的数据库,如MySQL, PostgreSQL, Oracle, Sql Server, DB2等;
支持多开发者的协作维护;
日志文件支持多种格式,如XML, YAML, JSON, SQL等;
支持多种运行方式,如命令行、Spring集成、Maven插件、Gradle插件等。

点击领取 https://www.dianjilingqu.com/


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM