用GO搞定那些老是得重复跑的SQL语句,省时又高效
- 问答
- 2025-12-23 13:26:58
- 3
你有没有遇到过这种情况?每天上班第一件事,就是打开数据库客户端,把那个你闭着眼睛都能打出来的SQL脚本再跑一遍,或者,每周一早上,你需要手动执行五六个SQL文件,然后把结果分别导出成Excel,再发给不同的部门,这些操作重复、枯燥,还特别容易出错,万一哪天你忘了,或者手抖输错了一个条件,那麻烦可就大了。
这种重复性的SQL任务,用GO语言来搞定,简直是杀鸡用牛刀——大材小用但异常高效,GO语言编译出来的是单个可执行文件,没有外部依赖,扔到服务器上就能跑,特别适合做这种自动化的小工具,下面我就说说具体怎么搞,保证不用那些让人头疼的专业术语。
第一步,连上数据库
想操作数据库,第一步肯定是连上它,在GO语言里,你通常会用一个叫“database/sql”的官方库,再加上对应数据库的驱动,比如MySQL就用“github.com/go-sql-driver/mysql”,这个过程就像是你用钥匙开门。
你先要告诉程序数据库的地址、用户名、密码、数据库名这些信息,千万别把这些信息硬写在代码里,不然哪天密码改了或者别人要看你的代码,就全暴露了,最好的办法是把它写在一个配置文件里,比如叫config.yaml,或者直接用在运行时传入参数的方式,代码里,你会写一个函数来处理连接,连接成功了,你会得到一个叫*sql.DB的东西,后面所有的操作都通过它来进行,记得用defer db.Close()语句,这样就算程序中途出问题,也能保证最后把数据库连接关掉,不然连接数越来越多,会把数据库拖垮的。
第二步,把SQL语句“存”起来

我们要处理那些重复的SQL语句,你肯定不想把一大段SQL字符串直接写在GO代码里,那样看起来乱,改起来也麻烦,这里有个很实用的办法:把SQL语句单独写在文件里。
你有一个查询上周销售数据的任务,你就创建一个文件,叫weekly_sales.sql,里面就写纯的SQL语句,然后在GO程序里,你去读取这个文件的内容,把它变成一个字符串,这样做的好处太明显了:第一,SQL和GO代码分开了,清爽;第二,万一业务逻辑变了,需要调整SQL,你直接去改.sql文件就行了,根本不用重新编译GO程序,这对于需要频繁微调SQL的场景来说,太方便了。
第三步,执行并处理结果
数据库连上了,SQL语句也准备好了,就差执行了,用刚才得到的db对象,调用Query或者Exec方法。Query用于会返回数据的查询语句(比如SELECT),而Exec用于不返回数据的操作(比如INSERT, UPDATE)。
执行查询后,你会得到一个结果集(rows),你需要遍历这个结果集,把每一行的数据读出来,GO语言里,你可以先定义好一个结构体(struct),这个结构体的字段正好对应你SQL查询返回的列,这样,在遍历的时候,就可以用rows.Scan方法,把当前这一行的数据,直接扫描(Scan)到你准备好的结构体变量里,这一步感觉就像是用模具去套零件,严丝合缝。

第四步,输出结果,解放双手
光把数据查出来还不够,我们的目标是自动化,你得把结果保存下来,最常见的有两种方式:
- 生成CSV或Excel文件: 这是发给业务部门最常用的格式,GO有很多强大的库可以帮你写CSV或者Excel文件,你在遍历查询结果的时候,不是已经把每一行数据都扫描到结构体里了吗?这时候,你就可以同时把这些数据一行行地写入到CSV或Excel文件中,程序跑完,一个崭新的报告就生成了。
- 直接发送邮件: 更狠一点,连手动发送邮件都省了,你可以在程序里集成发邮件的功能,等报告文件生成好后,程序自动调用发邮件的逻辑,把文件作为附件,发送给指定的邮件列表,这样你只需要设定一个定时任务,之后就完全不用管了,真正实现“躺平”。
第五步,让它自己跑起来:定时任务
整个程序写好了,怎么让它定时自动执行呢?在Linux服务器上,最常用的就是cron任务,你可以用crontab -e命令编辑定时任务,比如设置成每天上午9点执行:0 9 * * * /path/to/your/go_program,如果在Windows服务器上,可以用“任务计划程序”来实现同样的效果。
这样一来,你的程序就会像一个不知疲倦的机器人,准时准点地帮你完成那些重复的SQL工作。

举个简单的例子
假设我们有个每日用户统计的任务,我们创建一个daily_users.sql文件:
SELECT
date(created_at) as date,
COUNT(*) as new_users
FROM users
WHERE date(created_at) = CURDATE() - INTERVAL 1 DAY
GROUP BY date(created_at);
GO程序的主要逻辑大概是这样的(省略了细节):
- 读取配置文件,连接数据库。
- 读取
daily_users.sql到变量query中。 - 执行
db.Query(query)。 - 定义一个结构体:
type DailyStat struct { Date string; NewUsers int }。 - 遍历结果集,将数据扫描到
DailyStat变量中。 - 创建一个CSV文件,将
DailyStat的数据写入。 - (可选)调用邮件发送函数,将CSV文件发出去。
总结一下好处
用GO来搞定重复SQL,核心好处就几点:一是省时间,一劳永逸,把你从重复劳动中解放出来;二是可靠性高,机器执行比人手动操作出错的概率小得多;三是灵活,SQL和逻辑分离,方便调整;四是部署简单,一个二进制文件到处运行。
如果你正在被那些日复一日的SQL查询所困扰,真的可以花点时间学学GO的基础,写个小工具来自动化它,一开始可能会觉得有点麻烦,但一旦做成了,那种效率和成就感的提升,绝对是值得的。
本文由颜泰平于2025-12-23发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/66937.html
