我正在尝试使用pymsql连接到MySQL数据库,主机是'115.28.236.225',并使用默认端口:3306。代码如下(db_connect.py):
import pymysql
def connDB():
conn=pymysql.connect(host='115.28.236.225',user='root',passwd='xxx',db='yyy',charset='utf8', port=3306)
cur=conn.cursor();
return (conn,cur);
conn,cur=connDB()
我使用
python db_connect.py
来运行,但是,我收到错误消息pymysql.err.OperationalError: (1045, u"Access denied for user 'root'@'58.196.159.221' (using password: YES)")
,我不知道主机'58.196.159.221'来自哪里,与代码中的主机不对应。
(我尝试使用MySql Workbench连接MySQL,并且成功了,所以,我确信这一定是python代码有问题)。
我该如何解决这个问题?预先感谢!
pymysql 很棒,因为它是纯粹用 python 实现的 - 没有外部依赖。
我敢打赌,您没有从外部来源为
root
帐户设置适当的权限。
你看到 pymysql.err.OperationalError: (1045,u"Access denied for user 'root'@'58.196.159.221'
的原因是因为你可能只能从 'root'@'localhost'
访问 mysql,58.196.159.221
是你的 python 程序运行的系统的 IP 地址 - 不相信我?运行 ifconfig
并检查您的 IP 地址。
修复: 连接到
mysql
控制台并运行以下命令:
GRANT ALL ON root.* TO 'root'@'58.196.159.221' IDENTIFIED BY 'ENTER_PASSWORD_HERE' ;
FLUSH PRIVILEGES;
这将允许远程访问 mysql。
如果您只想从本地主机访问 mysql,您可以运行以下命令:
GRANT ALL ON root.* TO 'root'@'localhost' IDENTIFIED BY 'ENTER_PASSWORD_HERE' ;
FLUSH PRIVILEGES;
如果您想授予任何 IP 地址的访问权限:
GRANT ALL ON root.* TO 'root'@'%' IDENTIFIED BY 'ENTER_PASSWORD_HERE' ;
FLUSH PRIVILEGES;
FLUSH PRIVILEGES 从 mysql 数据库重新加载权限,这在更改用户权限后是必需的。
58.196.159.221很可能是运行脚本的客户端的地址。它没有权限访问您的远程数据库;您必须在 MySQL 本身中进行配置。
我遇到了完全相同的问题,相同的凭据在 MySQL Workbench 中有效,但在同一台计算机上的
pymysql.connect()
中无效。
就我而言,通过了
ssl_verify_identity=True
参数修复了
pymysql.err.OperationalError: (1045, u"Access denied for user 'your-user'@'your-ip' (using password: YES)")
错误:
connection = pymysql.connect(
host=host,
port=port,
user=user,
password=password,
db=db_name,
ssl_verify_identity=True,
)