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