本节将介绍怎样利用批处理脚本去调用 mysql 执行 sql 脚本。
假如你现在正在开发一个系统,而系统版本迭代很快。每个版本都有对应的数据库SQL脚本,而我们将每个版本的数据库脚本使用名为“版本-日期.sql”的文件进行保存。当我们版本变多时,sql文件也就将变多。如下图:
上图中,1.0.0-*.sql ~ 1.2.0-*.sql 为每个版本的数据库 SQL 脚本。version.txt 文件中保存当前软件数据库版本;run.bat 保存批处理脚本;
每次初始化/更新数据库时我们只需要执行 run.bat 脚本,然后根据 version.txt 中保存的当前软件版本信息,动态选择需要执行那些 sql。例如:当前版本为 1.1.2,当我们执行 run.bat 时,将数据库从 1.1.2 版本升级到最新版本(即 1.2.0);
run.bat 脚本内容如下:
@echo off if "%OS%" == "Windows_NT" setlocal enabledelayedexpansion set "CURRENT_DIR=%cd%" rem 数据库名称 set dbName=test rem 数据库用户名 set dbUsername=root rem 数据库密码 set dbPassword=XM_zm2019 rem 进入到批处理文件所在的目录 cd /d %~dp0 if not "%MYSQL_HOME%" == "" goto gotHome rem 如果没有定义 MYSQL_HOME 环境变量,则将当前目录设置为 MySQL 主目录 set "MYSQL_HOME=%CURRENT_DIR%" rem 判断 mysql.exe 和 mysqldump.exe 是否存在 if exist %MYSQL_HOME%\bin\mysql.exe ( if exist %MYSQL_HOME%\bin\mysqldump.exe goto okExec ) rem 如果还是没有找到 mysql.exe 和 mysqldump.exe rem 则将 MYSQL_HOME 设置为默认目录 D:\mysql-5.7.24-winx64 set "MYSQL_HOME=D:\mysql-5.7.24-winx64" :gotHome rem 判断 mysql.exe 和 mysqldump.exe 是否存在 if exist %MYSQL_HOME%\bin\mysql.exe ( if exist %MYSQL_HOME%\bin\mysqldump.exe goto okExec ) echo mysql.exe 和 mysqldump.exe 不存在 goto END :okExec set "exe_mysql=%MYSQL_HOME%\bin\mysql.exe" set "exe_mysqldump=%MYSQL_HOME%\bin\mysqldump.exe" echo exe_mysql %exe_mysql% echo exe_mysqldump %exe_mysqldump% rem 检查 MySql 服务是否启动,如果没有启动直接退出 tasklist /NH | findstr /i "mysqld.exe" > nul && goto okScript echo 检测到 MySql 服务未启动,请先启动 MySql 服务 goto END :okScript rem 提示用户是否备份 cd /d %~dp0 set /p is_bk=是否备份数据库(Y/N): if "%is_bk%"=="Y" goto okBackup if "%is_bk%"=="y" goto okBackup goto oKImport :okBackup echo 数据库备份开始...... set last_script_name=%date:~0,10% if not exist %cd%\db_bak ( mkdir %cd%\db_bak ) %exe_mysqldump% -u%dbUsername% -p%dbPassword% -R test > "%cd%\db_bak\bk_%last_script_name:/=-%_%time:~0,2%%time:~3,2%%time:~6,2%.sql" if not "%errorlevel%"=="0" ( echo ERROR: 备份数据库失败, CODE=%errorlevel% goto END ) echo 脚本备份完成,文件:bk_%last_script_name:/=-%.sql rem 开始导入数据库脚本 :oKImport set /p version=<version.txt if "%version%" equ "" ( set version=0.0.0 set continueInfo=全新安装数据库脚本 goto continueConfirm ) set continueInfo=从%version%版本升级到最新版数据库脚本 :continueConfirm set /p continueFlag=%continueInfo%。确定要继续吗(Y/N): if "%continueFlag%" equ "Y" goto startRun if "%continueFlag%" equ "y" goto startRun echo 不进行数据库脚本升级 goto END :startRun set currentVersion=%version:.=% echo mysql脚本初始化开始...... for %%i in (*.sql) do ( set "fileName=%%i" set "filePrefix=!fileName:.=!" set "prefixNum=!filePrefix:~0,3!" if !prefixNum! gtr %currentVersion% ( echo 初始化脚本 -------- %%i %exe_mysql% -u%dbUsername% -p%dbPassword% < %%i ) ) echo mysql脚本初始化结束,时间:%date:~0,4%-%date:~5,2%-%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% :END pause
(1)将 version.txt 文件的内容清空,然后执行 run.bat 脚本。运行结果如下:
(2)将 version.txt 文件的内容设置为 1.1.2,然后执行 run.bat 脚本。运行结果如下: