Python执行MySQL脚本文件时传递参数失败求解决方案
问题排查与解决方案
核心错误原因
-p参数格式错误:命令列表中-p和密码拆分为两个独立元素,mysql会将123识别为要连接的数据库名,而非登录密码,导致认证失败。-e参数执行逻辑冲突:使用-e指定语句时,mysql执行完该语句后会直接退出,不会继续处理后续stdin传入的source命令,变量@x的上下文无法传递到SQL脚本执行环境。- 主机地址参数错误:
-h后的取值为local,正常本地连接应该填写localhost,否则会出现域名解析失败无法连接数据库的问题。
修复后的代码
方案1:将变量设置和source命令都通过stdin传入
import subprocess filename = 'test.sql' # -p和密码合并为单个参数,主机地址修正为localhost cmd = ["mysql", "-h", "localhost", "-u", "user", "-p123"] process = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 把变量声明和source命令合并后传入标准输入,保证上下文一致 sql_input = f"set @x=333; source {filename};" output, err = process.communicate(sql_input.encode('utf-8')) # 可打印错误信息排查执行问题 if err: print(err.decode('utf-8'))
方案2:所有执行逻辑合并到-e参数中
import subprocess filename = 'test.sql' cmd = ["mysql", "-h", "localhost", "-u", "user", "-p123", "-e", f"set @x=333; source {filename};"] process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) output, err = process.communicate() if err: print(err.decode('utf-8'))
补充说明
- 如果担心密码明文出现在进程列表存在安全风险,可以将
-p123替换为--defaults-extra-file=指定权限严格的配置文件存放密码,或者去掉密码参数通过交互逻辑输入。 - SQL脚本路径建议使用绝对路径,避免mysql执行时找不到对应文件。
内容的提问来源于stack exchange,提问作者William Que
相关产品推荐
相关产品推荐

