如何使用subprocess.check_output正确传参查询MySQL数据库
问题解决说明
错误原因
你的报错核心是调用mysql命令行客户端的参数格式不符合规范,mysql命令要求所有连接配置项必须携带对应的选项前缀,不能直接按顺序传值。
正确传参规则
mysql命令行的标准参数格式如下:
- 主机地址:前缀为
-h,后跟主机名/IP - 端口:前缀为大写的
-P,后跟端口号 - 用户名:前缀为
-u,后跟用户名 - 密码:前缀为
-p,和密码之间不需要空格,也可以写成--password=你的密码格式 - 要执行的SQL语句:前缀为
-e,后跟SQL语句内容 - 最后直接指定目标数据库名即可
修正后代码示例
import subprocess hostname = 'DESKTOP-XXXXXX' port = '3306' username = 'my_username_goes_here' password = 'my_password_goes_here' database = 'Mydatabase' # 替换为你实际的数据库名 # 按mysql命令规范构造参数列表 cmd = [ 'mysql', '-h', hostname, '-P', port, '-u', username, '-p' + password, '-e', 'SELECT * FROM Mytable;', database ] try: # 加入stderr参数捕获错误输出,方便排查问题 result = subprocess.check_output(cmd, stderr=subprocess.STDOUT) # Python2环境直接打印 print result # Python3环境需要用以下写法转码 # print(result.decode('utf-8')) except subprocess.CalledProcessError as e: # 输出具体错误原因方便定位 print("执行失败,错误信息:", e.output.decode('utf-8'))
额外注意事项
- 如果运行提示找不到mysql命令,需要把mysql的bin目录加入系统环境变量,或者在参数里写mysql.exe的完整绝对路径
- 命令行明文传递密码存在安全风险,同一设备的其他用户可以通过进程列表查看到密码,对安全有要求的场景建议改用配置文件存储认证信息
- 你原来代码里的database变量填的是占位符,要替换为你实际创建的
Mydatabase才能正常访问
内容的提问来源于stack exchange,提问作者SimCoder
相关产品推荐
相关产品推荐

