使用SQLAlchemy执行MySQL系统命令失败,报SQL语法错误
解决SQLAlchemy执行MySQL系统命令的报错问题
问题原因
\! sh /home/satish/test.sh是MySQL命令行客户端(mysql)的内置命令,并非标准SQL语句。SQLAlchemy的Connection.execute()方法会把传入的内容当作SQL语句发送给MySQL服务器解析,服务器无法识别客户端专属命令,因此抛出语法错误。
正确执行方式
方式1:直接用Python执行系统命令(推荐)
如果脚本在本地机器上,完全不需要通过MySQL中转,直接用Python标准库subprocess执行即可:
import subprocess # 执行脚本,check=True会在命令执行失败时抛出异常 subprocess.run(["sh", "/home/satish/test.sh"], check=True)
方式2:通过MySQL服务器执行(需额外配置)
如果脚本部署在MySQL服务器所在主机,且必须通过MySQL触发执行,需要先安装lib_mysqludf_sys插件,启用sys_exec函数,然后通过SQL调用该函数:
- 安装并配置
lib_mysqludf_sys插件(此插件权限极高,需谨慎评估安全风险,具体配置步骤参考MySQL官方文档) - 用SQLAlchemy执行如下语句:
# 调用sys_exec执行系统命令,返回值为命令的退出码 result = db.execute("SELECT sys_exec('sh /home/satish/test.sh');") exit_code = result.scalar() print(f"命令执行退出码:{exit_code}")
注意:
sys_exec会以MySQL进程的权限执行系统命令,存在数据泄露、服务器被控制的风险,非必要场景不建议使用。
内容的提问来源于stack exchange,提问作者SatishV
相关产品推荐
相关产品推荐

