spring.sql.init 使用注意事项

Spring Boot 自动执行 SQL 脚本:从原生配置到 Flyway 实战 在 Java 工程实践中,数据库初始化是应用启动前的关键环节。Spring Boot 项目常常面临建表脚本分散、人工导入繁琐、环境迁移难以重复执行等痛点。基于 Spring 生态的自动化机制,开发者可通过 spring.sql.init 配置实现启动阶段自动执行 schema.sql 与 data.sql,也可以借助 ScriptUtils 或 ResourceDatabasePopulator 在代码中灵活控制执行时机。而为了满足多环境版本化跟踪与增量变更管理,Flyway 等迁移工具提供了更规范的解决方 阅读详情

默认情况下,每次 Spring Boot 项目启动都会自动执行 spring.sql.init 配置的 SQL 脚本 —— 但前提是满足初始化条件。


✅ 关键结论:是否每次启动都执行?

条件是否执行?说明
spring.sql.init.mode=always✅ 是每次启动都执行,无论数据库是否存在或是否已初始化
spring.sql.init.mode=embedded✅ 仅当使用嵌入式数据库时执行如 H2、HSQL、Derby 等。非嵌入式数据库(如 MySQL、PostgreSQL)不执行
spring.sql.init.mode=never❌ 从不执行完全禁用初始化功能
数据库中已有表结构,且脚本中有 CREATE TABLE IF NOT EXISTS✅ 仍会执行脚本仍会被运行,但不会报错(因为用了 IF NOT EXISTS)
数据库中已有数据,脚本中有 INSERT✅ 仍会执行会重复插入数据,可能导致主键冲突或数据冗余!

🔥 重点提醒:
Spring Boot 的 spring.sql.init 是“无状态”的初始化机制 —— 它不会判断“是否已经初始化过”,它只认配置和脚本文件的存在!


📌 示例说明

场景 1:mode: always + 启动两次
spring:
  sql:
    init:
      mode: always
      schema-locations: classpath:schema-mysql.sql
      data-locations: classpath:data-mysql.sql
  • 第一次启动:
    • 执行 schema-mysql.sql → 创建 users 表
    • 执行 data-mysql.sql → 插入 3 条用户记录
  • 第二次启动:
    • 再次执行 schema-mysql.sql → 如果没有 IF NOT EXISTS,会报错(表已存在)
    • 再次执行 data-mysql.sql → 再次插入 3 条相同数据 → 可能违反唯一约束(如 username UNIQUE)

👉 结果:数据重复、主键冲突、应用启动失败!


✅ 如何避免重复执行导致的问题?

✅ 方法一:在 SQL 脚本中使用安全语法(推荐)
-- schema-mysql.sql
CREATE TABLE IF NOT EXISTS users ( ... );  -- 安全建表
CREATE TABLE IF NOT EXISTS roles ( ... );

-- data-mysql.sql
INSERT INTO users (username, email) 
SELECT 'admin', 'admin@example.com' 
WHERE NOT EXISTS (SELECT 1 FROM users WHERE username = 'admin');

✅ 使用 IF NOT EXISTS 和 WHERE NOT EXISTS 可以幂等执行(多次执行也不会出错或重复)

✅ 方法二:开发阶段用 mode: always,生产环境设为 never
# application-dev.yml(开发环境)
spring:
  sql:
    init:
      mode: always

# application-prod.yml(生产环境)
spring:
  sql:
    init:
      mode: never
✅ 方法三:改用 Flyway / Liquibase(生产推荐)

这两个工具会记录每个迁移脚本的执行状态(在 flyway_schema_history 表中),确保:

  • 每个脚本只执行一次
  • 支持版本控制、回滚、顺序执行
  • 适合团队协作和生产部署
<!-- Maven 依赖示例 -->
<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
</dependency>

💡 最佳实践:
开发/测试 → 用 spring.sql.init 快速搭建
预生产/生产 → 必须改用 Flyway/Liquibase


🚫 常见错误场景(不加判断直接写 INSERT)

-- data-mysql.sql(错误写法)
INSERT INTO users VALUES (1, 'admin', 'admin@xxx.com');
INSERT INTO users VALUES (2, 'user1', 'user1@xxx.com');

→ 第二次启动时会报错:

Duplicate entry '1' for key 'PRIMARY'

因为你试图插入已存在的主键!


✅ 总结:什么时候会执行?

条件是否执行
mode=always✅ 每次启动都执行(危险!需幂等脚本)
mode=embedded✅ 仅嵌入式数据库(如 H2)启动时执行
mode=never❌ 从不执行
数据库不存在✅ 执行(会创建)
数据库存在但无表✅ 执行(建表)
数据库存在且有表✅ 仍然执行(可能报错或重复)

✅ 最佳建议(强烈推荐)

场景推荐做法
本地开发使用 mode: always + 幂等脚本(IF NOT EXISTS + WHERE NOT EXISTS)
单元测试使用 H2 + mode: always,每次测试前干净重建
CI/CD 测试环境使用 mode: always,配合内存数据库(H2)
预生产/生产环境禁用 spring.sql.init,改用 Flyway 或 Liquibase 管理数据库变更

🛠️ 附:如何快速验证是否被执行?

在 application.yml 中开启日志:

logging:
  level:
    org.springframework.boot.jdbc: DEBUG

启动后你会看到类似日志:

o.s.b.jdbc.init.ScriptStatementRunner : Executing SQL script from class path resource [schema-mysql.sql]
o.s.b.jdbc.init.ScriptStatementRunner : Executed SQL script from class path resource [schema-mysql.sql] in 45 ms.
o.s.b.jdbc.init.ScriptStatementRunner : Executing SQL script from class path resource [data-mysql.sql]
o.s.b.jdbc.init.ScriptStatementRunner : Executed SQL script from class path resource [data-mysql.sql] in 12 ms.

如果看到这些日志,就说明脚本被成功执行了。


✅ 一句话总结:

spring.sql.init 默认每次启动都执行脚本 —— 你必须自己保证脚本是“幂等”的,否则就会出错!
生产环境请务必改用 Flyway/Liquibase!

Spring Boot 2.5.0 重新设计的spring.sql.init 配置有啥用? 前几天Spring Boot 2.5.0发布了,其中提到了关于Datasource初始化机制的调整,有读者私信想了解这方面做了什么调整。那么今天就要详细说说这个重新设计的配置内容,并结合实际情况说说我的理解和实践建议。 弃用内容 先来纠正一个误区。主要之前在版本更新介绍的时候,存在一些表述上的问题。导致部分读者认为这次的更新是Datasource本身初始化的调整,但其实并不是。这次重新设计的只是对Datasource脚本初始化机制的重新设计。 先来看看这次被弃用部分的内容(位于org.springframe 阅读详情

相关推荐

Spring Boot3.x 启动自动执行sql脚本

ALWAYS:始终初始化数据库EMBEDDED:仅初始化嵌入式数据库NEVER:从不初始化数据库spring.sql.init.enabled:初始化的开关,默认是true。spring.sql.init.username:初始化脚本的用户名spring.sql.init.password:初始化脚本的密码spring.sql.init.schema-locations:配置与schema变更相关的sql脚本,多个用分号割开。

D_J_Dragon的博客 1857

SpringBoot启动自动执行sql脚本

在开发当中我们每次发布服务都需要手动执行脚本,然后重启服务,而SpringBoot有服务启动自动执行sql脚本的功能的,可以为我们省去手动执行脚本的这一步,只需要部署新的服务即可。这个功能是SpringBoot自带的功能不需要引入额外的依赖!

怪咖@的博客 8153

Spring Boot连接SQL Server:从基础驱动到高级配置的实战指南

本文详细介绍了Spring Boot连接SQL Server的实战指南,从基础驱动配置到高级连接池调优,涵盖JDBC驱动选择、连接字符串优化、生产级参数设置及多数据源路由等关键技巧。特别针对SQL Server的高可用性和性能优化提供了实用解决方案,帮助开发者快速解决常见连接问题。

weixin_30596735的博客 579

【无标题】

通常,使用springboot集成数据库时,需要提前创建好数据库,这样的手动操作明显过于繁琐。可以再springboot的配置中,增加启动时自动加载创建SQL脚本的配置。以上只适用于创建数据库,如初始化脚本的操作,还需要想别的办法。不同版本的springboot,可能在配置上有所差异。编辑application.properties文件。这样就可以保证,当数据表一定会被创建。

m0_46194428的博客 719

CSP历年真题201503-1-图像旋转(C/C++)

一、问题描述 旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度。 计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可。 输入格式 二、输入格式 输入的第一行包含两个整数n, m,分别表示图像矩阵的行数和列数。 接下来n行每行包含m个整数,表示输入的图像。 三、输出格式 输出m行,每行包含n个整数,表示原始矩阵逆时针旋转90度后的矩阵。 四、...

GTboy100的博客 1670

PAM4信号测试实战:从眼图分析到误码率测量的技术演进

在高速数字系统设计中,信号完整性测试是确保数据传输可靠性的核心环节。其基本原理在于通过时域和频域分析,精确评估信号在传输过程中的质量衰减与失真。随着数据速率向56Gbps及以上演进,传统的NRZ编码面临带宽瓶颈,而PAM4调制技术通过在每个符号周期内承载更多比特信息,成为提升信道效率的关键路径。这项技术的工程价值在于,它允许在相同带宽下实现翻倍的数据吞吐量,这对于数据中心互联、PCIe 6.0及800G以太网等高速接口至关重要。然而,PAM4信号电平间距更小,对噪声和抖动极为敏感,导致其原始误码率显著升高,

weixin_42522817的博客 656

Springboot启动(DataSources创建时)执行初始化SQL脚本 – 源码剖析 – 超级干货

本页目录 SpringBoot加载SQL脚本源码剖析应用Springboot自动初始化SQL开启自动初始化Sql语句。spring.sql.init.mode属性有可供选择的状态有总结很多开源项目我们没有导入SQL进入数据库,但是项目一旦启动,就会替我们执行初始化数据了。我们今天来分析是如何实现的。SpringBoot加载SQL脚本源码剖析直接从数据源初始化配置进入,查看createFrom()@...

weixin_45129599的博客 1165

暗黑破坏神2重制版 mod制作教程(一)

暗黑2重制版mod修改教程

hhhh2312的博客 7447

Spring Boot 2.6.7 初始化 MySQL 数据库

有些场景,需要我们在项目启动的时候,初始化数据库表。JPA 虽然能达到很好的功能,但是我们用的是 Mybatis Plus,因此使用 Spring 官方提供的启动项目时初始化 sql 的功能。

Java Pro 1825

DeepSeek-V4 本地部署实战指南:4套方案从入门到企业级(附RTX 5090实测数据)

V4-Flash 便宜是便宜,输入 1 元/M token,输出 2 元/M token,但量大了还是肉疼。V4-Pro 更离谱,输入 12 元/M token,输出 24 元/M token,这价格要是天天调用,月账单轻松破万。用 4-bit 量化跑 V4-Flash,显存占用 ~22GB,延迟 ~80ms/token,并发能到 2-3 路。换句话说,同样的硬件,能跑更长的上下文、更大的并发。Flash 是「小而美」,一张 RTX 4090/5090 就能跑,门槛低,效果够用。

datayx的文章 9813

如何在R中高效安装ropls及其依赖包

本文详细介绍了在R语言中高效安装ropls包及其依赖的完整流程。作为Bioconductor生物信息学分析包,ropls的安装需通过BiocManager管理器进行。文章提供了标准安装步骤、跨系统避坑指南及安装后验证方法,帮助用户解决R版本、编译环境和网络镜像等常见问题,确保代谢组学数据分析工具顺利部署。

efc123456的博客 907

重新设计的spring.sql.init 配置有啥用?

弃用内容 先来纠正一个误区。主要之前在版本更新介绍的时候,存在一些表述上的问题。导致部分读者认为这次的更新是Datasource本身初始化的调整,但其实并不是。这次重新设计的只是对Datasource脚本初始化机制的重新设计。 先来看看这次被弃用部分的内容(位于org.springframework.boot.autoconfigure.jdbc.DataSourceProperties),如果你有用过这些配置内容,那么新配置就很容易理解了。 /** * Mode to apply when determ

weixin_45032957的博客 3766

【YOLO系列】YOLOv11详解:模型结构、损失函数、训练方法及代码实现

YOLOv11在目标检测领域实现重大突破,通过动态骨干网络(Dyna-Backbone)和FPN++架构,在保持高帧率(≥60FPS)的同时提升小目标检测精度(AP_S提升5.6%)。创新采用CIoU++损失函数和类别平衡Focal Loss,结合Mosaic-Plus数据增强,参数量减少18%至6.5M。实验显示,该模型在COCO数据集上实现更高mAP,特别适合移动端部署,Jetson Xavier平台能耗比优化至3.2W·ms⁻¹,支持目标检测、实例分割等多任务场景。关键创新包括动态深度调整和双向特征金

一碗白开水一 3443

Spring Boot 如何通过 SQL 脚本自动初始化数据库模式和数据?

Spring Boot 内置的基于脚本的数据库初始化器可以在启动时自动执行 SQL 脚本,创建数据库模式(DDL 脚本)并初始化数据(DML 脚本),不需要你单独连到数据库手工执行建表语句。本文基于 Spring Boot 官方 how-to 文档,说明如何用 `schema.sql` 和 `data.sql` 完成"建模式 + 填数据"的初始化,涉及哪些配置项,以及如何根据文档描述的信号判断初始

gitblog_00318的博客 1070

利用 Python 构建高效爬虫爬取国家标准文献——从基础到进阶

然而,由于许多标准文献需要从特定网站获取,手动下载既耗时又低效,因此构建自动化爬虫成为一种实用且高效的解决方案。本文从技术选型、网站分析、代码实现到反爬优化,全面讲解了如何爬取国家标准文献。国家标准文献(National Standards Literature)是国家对各领域统一规范的文件,涵盖了技术参数、测试方法、生产工艺等内容。因此,通过自动化爬虫技术进行文献爬取和管理,不仅能解放劳动力,还可以提高数据管理效率。在构建爬虫前,我们需要对目标网站进行分析,包括页面结构、请求方式以及可能的反爬机制。

2201_76125261的博客 2104

深度测评:Accio Work——目前普通用户最友好的多 Agent 协同工具

摘要:Accio Work是阿里国际站推出的多Agent协同工具,通过借鉴古代"三省六部制"构建高效协作框架。该工具支持主流大模型,可配置专业Agent角色,实现40分钟内完成复杂产品PRD等高效协作。其亮点在于直观的UI设计和流程驱动机制,能强制各Agent从专业视角深度思考。虽然超长对话稳定性有待优化,但作为目前最用户友好的多Agent工具,显著降低了构建复杂AI团队的门槛,成为提升个人和小微企业生产力的利器。

Maynor的博客 1726

spring.sql.init 用于自动执行 SQL 脚本来创建数据库结构(Schema)和插入初始数据(Data)

摘要:Spring Boot默认每次启动都会执行spring.sql.init配置的SQL脚本,但具体行为取决于初始化模式:always(每次都执行)、embedded(仅嵌入式数据库执行)或never(禁用)。为避免重复执行导致数据冲突,建议在脚本中使用IF NOT EXISTS等幂等写法,或在生产环境改用Flyway/Liquibase管理数据库变更。开发阶段可使用always模式配合安全语法,但生产环境需谨慎处理。

python15397的博客 965

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Springboot使用spring.sql.init.schema-locations 初始化数据库脚本所遇问题(坑爹的PostgreSQL的美元符号)

其实实现这个需求有多种方式(这里我不多啰嗦,各位可以自行百度),我采用的是spring.sql.init.schema-locations配置创建数据库和主键索引的SQL语句,使用spring.sql.init.data-locations初始化表数据,使用简单明了。赶紧分析一下,我语句没有问题,navicat可以执行,那只能是spring在解析sql语句后执行出错了。是不是看着什么问题也没有,是不是很简单,我当时也是这么认为,而且我在navicat中执行也没有任何问题。愿工作中没有BUG!

kiss002wk的博客 1484

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

mysql init file_Mysql启动时执行文件init-file的使用

可以在配置文件里指定mysql启动以后初始执行的SQL文件, 其语法是:在[mysqld]下指定:init-file="D:/mysql/test.sql", 后面为具体的sql文件值。注意下边两点就行了:1. 确保你的mysqld 编译的时候没有加 --disable-grant-options 开关。2. 确保init-file指定的脚本每行是一个具体的可以执行的语句。废话不多说(上面截图...

weixin_32210881的博客 1168

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

spring-boot启动执行sql

这里的执行区分为spring-boot的1.x和2.x如果是1.x可以直接在application.yml里面指定sql文件即可 很多同学在使用spring-boot2.x的时候发现sql文件没办法执行因为这里需要在application.yml里面进行初始化的配置见图 我这里指定的是always每次启动都执行,而下面的schema点进去看的时候可以发现他是一个List所以可以接受多个sql 注意:这里的sql一定要指定位置,否则读取不到会报错,如图所示我使用的是classpath:来指定从编译后的.

weixin_47733858的博客 1672

Hikari 连接池的复用行为及connection-init-sql初始化sql使用场景

给connection设置了sql_log_bin=0后,将connection归还给hikari,sql_log_bin=0还生效吗?答案是:不会安全生效,如果直接把Connection归还给 Hikari 连接池,sql_log_bin=0。

学亮编程手记 550

Spring Boot启动时自动导入SQL:三条实测路线与踩坑指南

数据库初始化不应该是团队协作的瓶颈。Spring Boot通过内置的SQL初始化机制,让应用启动时自动执行建表和写数据脚本,省去手工导库的繁琐过程。其设计哲学是将数据源生命周期与脚本执行绑定,通过spring.sql.init配置或手动DataSourceInitializer实现可控的初始化流程。这种自动化能力在本地开发、测试环境一键部署等场景中价值显著,配合Docker的initdb.d目录或迁移工具,能极大降低环境搭建成本。然而,实际使用中常遭遇文件编码、Druid防火墙拦截、大SQL文件OOM等兼容

weixin_29207439的博客 261

Spring Boot连接MySQL常见SQL语法错误排查指南

SQL语法错误是数据库开发中的常见问题,特别是在Java应用中使用Spring Boot连接MySQL时。SQL语法解析是数据库引擎的核心功能,当执行计划生成阶段发现语法违规时,会抛出SQLSyntaxErrorException。这类错误直接影响系统可用性,需要开发者掌握快速定位方法。在Spring生态中,通过JdbcTemplate、JPA或MyBatis等ORM框架执行SQL时,常见的语法问题包括引号误用、保留字冲突和分号处理不当。合理配置Hibernate SQL日志或使用P6Spy等工具可以完整捕

weixin_34226706的博客 284

Spring Boot中SQL语法错误的排查与解决方案

SQL语法错误是数据库开发中的常见问题,特别是在使用ORM框架如Spring Data JPA或MyBatis时。这类错误通常表现为'bad SQL grammar'异常,可能由SQL语句本身、框架生成的SQL、数据库方言配置或字符编码问题引起。理解SQL语法错误的排查流程和解决方案对于Java开发者至关重要,尤其是在企业级应用开发中。本文通过实际案例,详细解析了如何获取真实SQL语句、验证语法、检查数据库兼容性,并提供了JPA/Hibernate和MyBatis场景下的典型修复方案。掌握这些技巧可以有效提

weixin_34343000的博客 445

Spring Boot导入SQL文件:从自动初始化到Flyway迁移实践

数据库脚本导入是应用开发中的基础需求,无论是初始化表结构还是批量写入数据,都需要稳定可靠的执行方式。在Spring Boot项目中,系统内置的SQL脚本初始化机制(如spring.sql.init配置)能实现启动时自动加载schema和data文件,其原理基于数据源脚本执行器;而通过ScriptUtils工具类则支持手动执行任意SQL文件。随着项目迭代,Flyway等数据库迁移工具成为管理版本变更的主流方案,它通过版本化脚本确保变更可追踪、可重复。从开发环境的自动初始化,到生产环境的迁移控制,不同场景需要选

weixin_33552698的博客 231
上一篇: 怎么实现自动记录和统计 SELECT 慢查询?
下一篇: PostgreSQL 和 MySQL 数据库建表脚本示例参考
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值