当前位置: 首页 > news >正文

如何优雅地完成项目数据库的初始化

简介

当项目在一个新的环境启动或部署时,必不可少的步骤是完成数据库的初始化

将所需要的数据库表,可能还有一些初始的配置数据一次性写入到数据库中

常规的做法,是将初始化脚本整理到项目的资源目录中,提醒开发程序员或者运维人员在部署时手动执行

本文介绍如何优化地完成这个动作,将初始化脚本写入到项目的配置文件中,项目启动时,自动执行该脚本,完成数据库的初始化

配置

简单来说,是在 application.yml 文件中,增加下面这个配置,指定项目启动时加载的数据库脚本

spring:# 数据库连接配置(先连接到MySQL服务器,不指定数据库)datasource:url:jdbc:mysql://localhost:3306/?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=trueusername:rootpassword:123456driver-class-name:com.mysql.cj.jdbc.Driver# 核心配置:自动执行SQL初始化数据库sql:init:# 开启SQL初始化(SpringBoot 2.5+ 默认关闭,必须手动开启)mode:always# 指定要执行的SQL路径(多个用逗号分隔)schema-locations:classpath:init.sql# 编码(解决中文乱码)encoding:utf-8

init.sql内容如下,是数据库的初始化脚本,注意这个脚本应设计成幂等的,即多次执行效果相同

具体来说,就是创建前先判断是否存在,存在了就不创建,不存在才创建

-- =============================================-- 数据库初始化脚本-- 优雅初始化数据库演示项目-- =============================================-- 创建数据库(如果不存在)CREATEDATABASEIFNOTEXISTS`db_elegant`DEFAULTCHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;-- 使用该数据库USE`db_elegant`;-- 创建用户表(如果不存在)CREATETABLEIFNOTEXISTS`db_elegant`.`user`(`id`BIGINTNOTNULLAUTO_INCREMENTCOMMENT'主键ID',`username`VARCHAR(50)NOTNULLCOMMENT'用户名',`email`VARCHAR(100)DEFAULTNULLCOMMENT'邮箱',`age`INTDEFAULTNULLCOMMENT'年龄',`created_at`DATETIMEDEFAULTCURRENT_TIMESTAMPCOMMENT'创建时间',`updated_at`DATETIMEDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'更新时间',PRIMARYKEY(`id`),UNIQUEKEY`uk_username`(`username`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='用户表';-- 创建商品表(如果不存在)CREATETABLEIFNOTEXISTS`db_elegant`.`product`(`id`BIGINTNOTNULLAUTO_INCREMENTCOMMENT'主键ID',`name`VARCHAR(100)NOTNULLCOMMENT'商品名称',`description`VARCHAR(500)DEFAULTNULLCOMMENT'商品描述',`price`DECIMAL(10,2)NOTNULLDEFAULT0.00COMMENT'价格',`stock`INTNOTNULLDEFAULT0COMMENT'库存',`created_at`DATETIMEDEFAULTCURRENT_TIMESTAMPCOMMENT'创建时间',`updated_at`DATETIMEDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'更新时间',PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='商品表';-- 插入测试数据(数据不存在时才插入)INSERTIGNOREINTO`db_elegant`.`user`(`username`,`email`,`age`)VALUES('张三','zhangsan@example.com',25),('李四','lisi@example.com',30),('王五','wangwu@example.com',28);INSERTIGNOREINTO`db_elegant`.`product`(`name`,`description`,`price`,`stock`)VALUES('iPhone 15 Pro','苹果最新款手机',8999.00,100),('MacBook Pro 14英寸','M3芯片专业笔记本',14999.00,50),('AirPods Pro','主动降噪耳机',1899.00,200);-- 输出初始化完成信息SELECT'数据库初始化完成!'ASmessage;

测试

启动项目试一下

它自己就把数据库脚本执行了

而且后续接口的查询,也都能查到该数据库的数据,因为在脚本中指定了数据库(USE db_elegant;

http://www.jsqmd.com/news/662388/

相关文章:

  • PRPS 是 SAP PS 模块存储 WBS 元素主数据的核心表,主键为 MANDT+PSPNR,包含标识、层级、组织、成本、权限、时间与用户自定义等多类字段,适用于查询、报表与接口开发。
  • 【LLM转型三周年纪念——Harness agent 理解】成为每个读者的独家记忆,从第一性原则出发,一文打穿你的AI幻觉,
  • FanControl深度体验:让Windows电脑风扇从此智能静音
  • WechatDecrypt终极指南:简单三步恢复微信聊天记录
  • Quartus II 13.1 联合 Modelsim 仿真避坑全记录:从Testbench生成到波形查看
  • 20252818 2025-2026-2 《网络攻防实践》第五周作业
  • 【Python实战】VRChat中文吧自动演奏:从乐谱解析到键盘模拟
  • SAP ECC6 EC-CS 专用「标准资产负债表模板」
  • 【RAG 详解:让模型学会“查资料”】
  • 基于诺伊(RuoYi)管理后台开发框架的前后端分离单体架构与Java分层架构开发规范
  • 【艺术家紧急自救手册】:2026奇点大会实证——AGI接管创意流程的7个高危节点及防御策略
  • 编译型与解释型语言
  • 3个必装功能!英雄联盟玩家效率翻倍的本地化工具完全指南
  • 2026自考培训口碑机构大比拼,哪家更胜一筹?国家开放大学招生/学历提升/成人学历提升/专升本报名,自考培训学校推荐 - 品牌推荐师
  • 宿舍党福音:用旧小米路由器3搞定SCUT校园网多设备连接(附编译好的固件)
  • 【STM32】实战3.2—基于TB6600与微步进控制实现42步进电机的平滑驱动
  • 告别Keil:基于VSCode+ARM-GCC+OpenOCD的STM32一站式开发环境实战
  • Pixel Epic智识终端应用:智能硬件产品技术白皮书AI协同编写流程
  • 嵌入式设备上的轻量化Pixel Script Temple部署与实践
  • 2026年3月,热门洗涤设备直销厂家优选推荐来了,医院洗涤设备/洗涤设备/洗涤设备全套,洗涤设备实力厂家有哪些 - 品牌推荐师
  • 如何部署OpenClaw?2026年4月云端大模型Coding Plan配置步骤
  • abinit学习日记三十——tbs_5.abi
  • 【紧急预警】当前92%的AGI验证方案存在逻辑断层!资深审评官亲授4步闭环验证法
  • 【数字IC】从UART协议到Verilog实现:一个IC工程师的实践指南
  • abinit学习日记二十九——tbs_4.abi
  • 从TLS握手到威胁狩猎:实战解析JA3/JA3S指纹的攻防应用
  • 从CrossEntropyLoss倒推理解:为什么PyTorch里常用F.log_softmax?
  • 2026年选高温熔盐泵,教你选液下熔盐泵实力厂家,高效节能叠片同步自吸泵/透平自吸泵,高温熔盐泵实力厂家有哪些 - 品牌推荐师
  • 2026年3月正规的壁灯工厂推荐,景观灯照明/100w工矿灯/led户外灯具/外墙景观灯/室外照明灯具,壁灯厂家找哪家 - 品牌推荐师
  • 如何在ComfyUI中实现专业级动画效果:MTB Nodes完全指南