我使用的是python3.6+pymysql+mysql8.0.11
下面是简单的连接数据库的代码,注释很清楚
#!/usr/bin/python3
import pymysql
# 打开数据库连接
db = pymysql.connect("localhost","root","root","stu_system" )
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
# 使用 execute() 方法执行 SQL 查询
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法获取单条数据.
data = cursor.fetchone()
print ("Database version : %s " % data)
# 关闭数据库连接
db.close()
运行之后得到错误
pymysql.err.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: NO)")
经过查资料得知:原因是新版mysql使用的caching_sha2_password,旧的驱动不支持新的mysql的验证方式,把mysql验证方式换回mysql_native_password,就可以连上了。我也不知道对不对,抱着试试的态度 ,把验证机制改回去。在这里我的用户名和密码都是root,请各位采用该方法的时候因地制宜。
USE mysql;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
FLUSH PRIVILEGES;
然后运行py ,错误变了,变成了下面的样子
pymysql.err.InternalError: (1043, 'Bad handshake')
然后这个错误我改了好久,也改不对。别人说这是因为旧的驱动不支持新的mysql的验证方式引起的。
解决办法:一、让mysql使用旧的密码验证方式。二、就是换新驱动。
可我前脚刚换了旧的密码验证方式,难道是没换成功?想想:肯定换成功了,否则错误怎么会变了呢?所以我打算试试第二个方案,更新驱动!
是不是当时下载的包不是最新版本?于是我把包卸载了,重新用conda安装,结果如图,还是报错。
又突然想到conda安装的包可能版本也不对?又用pip安装了一下,果然pip安装的是更新的版本。然后错误也没了,连接成功!
哎?不是旧的驱动和新的mysql验证方式不匹配吗?我换了新的驱动,也换旧了验证方式emmm,结果还成功了??hhhhhhh,时间关系,我没有去深究这个事情,如果哪位大佬晓得,还请不吝赐教。我先码代码去啦,被这个bug卡了好久,该写写代码追开发进度了,溜了~