python - 为什么我可以通过shell连接到MySQL,但不能通过Python连接?
问题描述
我正在通过服务器上的 SSH 连接到 MySQL db。我设法通过 MySql 工作台和系统 shell 来做到这一点,这意味着密码、用户名和 ip 是正确且允许的。
现在我正在尝试通过 Python 进行连接。我正在使用 sshtunnel 包,其设置与工作台中的设置相同(在 shell 中都是默认设置)-mysql 端口 3306,ssh 端口 22,mysql 主机名 127.0.0.1,它连接了我。当我尝试通过连接器连接到数据库时,我得到:
mysql.connector.errors.ProgrammingError: 1045 (28000): Access denied for user 'myusername'@'localhost' (使用密码: YES)。
我还尝试使用以下命令直接通过 shell 与 python 连接:
os.system("mysql -u myusername -p")
我得到了:
错误 1045 (28000): 用户 'myusername'@'localhost' 的访问被拒绝(使用密码:是)
我在这里检查:
无法通过 MySQL Workbench 或 HeidiSQL 访问 MySQL,但可以通过 shell 访问
还有更多,但我发现没有任何帮助。我的 Python 版本是 3.6.8,MySql 版本是 5.7.31。python 访问的 shell 和普通的 Unix 访问的 shell 之间还有什么不同?还是通过工作台访问?
编辑:
请求的代码。所有三个连接都给出完全相同的输出。
with sshtunnel.SSHTunnelForwarder(
(ssh_host, ssh_port),
ssh_username=ssh_username,
ssh_password=ssh_password,
remote_bind_address=('localhost', mysql_port)) as tunnel:
# conn = mysql.connector.connect(**mysql_config)
conn = MySQLdb.connect(host="localhost",
user="myusername", passwd="password", db="mydb")
print(conn)
# print(os.system("mysql -u myusername -p"))
解决方案
我设法与:
tunnel = sshtunnel.SSHTunnelForwarder((ssh_host, 22), ssh_password=ssh_password, ssh_username=ssh_username,
remote_bind_address=('localhost', 3306))
tunnel.start()
显然,不同之处在于保持隧道打开而不是使用'with'语句,尽管我不明白实际发生了什么,我很感激解释。
推荐阅读
- terminal - 终端的条件 ZSH_THEME
- python - Python - 如何在单个图形中绘制来自多个文本文件的数据
- graphql - graphql-java 中的模拟 api 响应
- excel - 基于对齐方式排序
- docker - Hadoop 连接被拒绝,Docker 上的高可用性名称节点配置
- python - 连接两个 pandas 数据框进行分析
- javascript - 如何在一个 ajax 请求中添加文件和 html 类型数据
- javascript - 更改 HTML 内容后为 DIV 设置动画
- javascript - 输入字段中的连接符号
- oracle - 使用一个表作为另一个表计算的参考点