Navicat 不支持通用脚本编程,其“校验脚本”实为可量化SQL查询,需配合外部工具实现告警闭环:SQL输出单值→Navicat定时导出CSV→Python/PowerShell读取判断→调用API发送告警。
Navicat 里根本不能直接写“校验脚本”
navicat 本身不支持类似 python 或 shell 那样的通用脚本编程,它所谓的“脚本”仅指 sql 脚本(即 select、count、exists 等语句组合),无法做逻辑判断、变量赋值或发送邮件。所谓“自动化数据校验”,本质是:用 sql 写出可量化的对比逻辑 → 在 navicat 中保存为查询 → 借助外部机制触发执行并处理结果。
用 SQL 实现核心对比逻辑(必须可量化)
关键不是“查两表长得像不像”,而是定义明确的校验维度,每项输出一个可断言的数值。例如:
-
COUNT(*)对比:源表和目标表行数是否一致(注意过滤条件要完全一致) -
COUNT(DISTINCT key_col)对比:主键/业务键去重数量是否一致,排查重复或丢失 -
MIN(ts), MAX(ts)对比:时间范围是否覆盖预期(如当天数据WHERE ts >= CURDATE()) ABS(SUM(amount) - SUM(amount_bak)) :金额汇总容差校验(避免浮点误差)-
SELECT COUNT(*) FROM (SELECT id FROM t1 EXCEPT SELECT id FROM t2) t:找出在 A 表存在但 B 表缺失的 ID(需注意 NULL 处理)
所有语句必须返回单行单列(如 INT 或 DECIMAL),否则 Navicat 的“计划任务”无法解析成功/失败。
Navicat 计划任务只能执行查询,不能预警
Navicat 的「计划任务」功能(Windows 下依赖 Windows Task Scheduler,macOS 下依赖 launchd)只做一件事:定时连接数据库、运行指定查询、保存结果到文件(CSV/Excel)。它不会判断结果是否异常,更不会发邮件或钉钉。
- 导出路径必须写绝对路径,且 Navicat 进程有写入权限(常见坑:
C:\Users\Me\Documents在 Win10+ 可能被拦截) - 查询中不能含交互式语句(如
SET @var = ...),部分版本不支持变量 - 若想“预警”,必须额外加一层:用外部脚本(Python/PowerShell)读取导出的 CSV,检查数值是否越界,再调用邮件 API 或 Webhook
例如,导出的 row_count_check.csv 第一行是 diff_count,值为 0 表示正常;若为 42,就该触发告警。
真正可行的轻量级闭环方案
绕过 Navicat 的限制,用它最稳的功能:SQL 查询 + 导出,其余交给系统级工具:
- 在 Navicat 中写好对比 SQL,保存为查询,勾选「导出查询结果」→ 指定 CSV 路径和字段分隔符
- 用 Windows 自带的
schtasks或 macOS 的launchctl定时启动 Navicat 并运行该查询(命令行参数参考:navicat.exe /runquery "MyProject.nvproject" "row_check_query") - 另写一个 Python 脚本,每 5 分钟检查该 CSV 是否更新、内容是否为预期值(如第一行数字 ≤ 1),不满足则调用
smtplib发邮件或requests.post推送钉钉机器人 - 把 Python 脚本也加入系统计划任务,确保它比 Navicat 导出任务晚 1–2 分钟执行
这个链路里,Navicat 只负责“取数”,真正的逻辑判断和响应必须由外部程序完成——这是最容易被忽略的分界点。


















