- 文档
- 教程
- 知识库
【免费下载链接】til
:memo: Today I Learned
在运行数据库种子(seed)脚本时,往往需要一段醒目的提示信息来标记脚本开始执行,本文将介绍如何借助 MySQL 客户端的 shell 命令\system及其简写\!,在脚本被批处理执行时把自定义横幅输出到 stdout。读完本文,你将掌握在seed_data.sql这类脚本中插入可读横幅的完整写法,并了解它在种子脚本、数据回灌等场景下与事务、insert ignore等技巧的组合用法。
场景:给种子脚本加上执行提示
当我们准备了一个用于初始化数据库的 SQL 文件(例如通过mysqldump导出的备份,或手工编写的种子数据脚本,参见仓库笔记 dump-a-database-to-a-file.md),并希望在整个文件开始执行时先向终端回显一条消息,说明"开始加载种子数据"时,通常有两类做法:
- 在 shell 层面拼接
echo,例如echo "..." && mysql ... < seed.sql; - 直接把提示写进 SQL 文件内部,让它跟随脚本一起执行。
第二种做法的好处是提示信息与数据脚本始终同步存在:任何人拿到这个.sql文件,无论用什么方式执行(重定向、管道、客户端工具),横幅都会自动出现,不会因忘记在命令行上补一句echo而缺失。这正是本仓库笔记 echo-a-message-from-a-sql-file.md 所讲解的技巧。
MySQL 客户端的 shell 命令:\system与\!
MySQL 客户端(mysql)提供了一组客户端自身解析的shell 命令,它们不是发送给服务器执行的 SQL,而是在本地由客户端进程处理。其中\system命令用来执行一条操作系统的 shell 命令,并直接把该命令的输出写入 stdout;它还有一个等价的简写形式\!。
\! ls -l \system date上面两条都会在客户端本地执行对应系统命令并把结果打印到终端。利用这一点,我们可以在 SQL 文件的任意位置调用系统的echo命令来输出提示文本。
注意:
\system/\!执行的是客户端所在机器的本地命令,与 MySQL 服务器无关,也不受服务器端权限控制;它的输出与 SQL 查询结果一样流向标准输出。
完整示例:向种子脚本添加横幅
下面是一个典型的种子脚本开头写法(沿用原文档 echo-a-message-from-a-sql-file.md 的示例):在执行insert into products ...之前,先用五条\! echo打印出一个用*绘制的横幅:
\! echo '*****************************************' \! echo '* *' \! echo '* Loading seed data into the database *' \! echo '* *' \! echo '*****************************************' insert into products ...要点拆解:
- 每条
\! echo '...'都会在脚本执行到该行时,立即在终端输出一行文本,横幅因此逐行打印出来; echo是系统命令,文本需要用单引号包裹,防止被 shell 展开(例如*在双引号下可能触发路径通配);- 横幅与后续 SQL 之间留空行,便于阅读,也避免影响语句解析。
运行效果:批处理模式同样生效
把脚本通过标准输入重定向交给mysql客户端执行时,横幅会原样出现在查询结果之前。原文档中的运行示例(连接参数为-h ::1 -P 3306 -u root -D local_database):
$ mysql -h ::1 -P 3306 -u root -D local_database < seed_data.sql ***************************************** * * * Loading seed data into the database * * * *****************************************可见\!命令在非交互式(批处理)模式下同样被客户端解析执行——这正是它能写进脚本文件、随文件一起分发的原因。需要注意的是,横幅打印位置紧跟在脚本执行的起点,之后才开始执行insert等语句,因此把它放在文件头部,就能起到"脚本开始"的标记作用。
与种子脚本相关的组合技巧
种子脚本往往不是孤立的一次性操作,结合本仓库mysql/目录下的其他笔记,可以把这套"横幅 + 数据装载"的流程做得更稳:
- 幂等装载:种子数据可能重复执行而触发主键/唯一键冲突。仓库笔记 ignore-duplicates-when-inserting-records.md 指出,将
insert改为insert ignore,可让重复行被丢弃并转为 warning,而不是中止整个脚本——与横幅配合,脚本执行过程更可控; - 事务包裹:对生产库做修改型种子/修复脚本时,可在文件内用
start transaction; ... commit;(必要时rollback)包裹变更,先验证再提交,参见 run-statements-in-a-transaction.md; - 安全更新模式:连接时使用
--safe-updates(或--i-am-a-dummy)可阻止不带 KEY 条件 WHERE 的update/delete误伤数据,适合在种子清理场景下兜底,参见 connect-to-a-database-in-safe-update-mode.md; - 输出格式化:脚本中的
show类查询可用\G结尾获得纵向输出,横幅配合纵向结果在终端上更易读,参见 display-output-in-a-vertical-format.md。
小结
\system/\!是 MySQL 客户端内置的 shell 命令透传入口,把它与系统的echo结合,就能在 SQL 文件内部声明执行提示,且该提示在交互式与批处理模式下都会生效。对于mysql ... < seed_data.sql这类常见的种子装载方式,这是一种零额外依赖、随文件自带的输出标记方案,可以让脚本的执行过程在终端上一目了然。
- 文档
- 教程
- 知识库
【免费下载链接】til
:memo: Today I Learned
相关推荐
x64dbg 脚本引擎 error 命令:显示错误信息并终止脚本执行
x64dbg 脚本引擎 error 命令:显示错误信息并终止脚本执行 导读 error 是 x64dbg 脚本引擎(simple script engine)中
逆向工程调试器开发工具应用安全linux-command 项目 mysql 命令详解:MySQL 命令行客户端完整使用指南
linux command 项目 mysql 命令详解:MySQL 命令行客户端完整使用指南 本文以 Linux 命令大全项目(linux command)中收
文档教程neofetch 命令详解:在终端显示系统信息与发行版徽标(linux-command 命令手册)
neofetch 命令详解:在终端显示系统信息与发行版徽标(linux command 命令手册) neofetch 是一款在终端中显示系统摘要信息并配以发行版
文档教程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考