python 连接mysql 踩坑

我使用的是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卡了好久,该写写代码追开发进度了,溜了~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值