SpringBoot 实现配置SQL脚本自动执行

一. 背景

我们可能遇到过这种情况:

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

因此我们需要考虑: Springboot 到底有没有自动执行SQL的功能?
答案是确定的, 而且解决方案不止一种


二. 使用方式

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

    在这里插入图片描述

  2. 在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.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
    
  3. 正常启动项目即可

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插件等。

具体介绍和使用方式可参照下面博客 博客一 博客二


Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐