zoukankan      html  css  js  c++  java
  • pymsql链接数据库报错2003的解决过程记录

    在使用pymsql链接mysql8.0的时候编辑好如下代码

     
    1 import pymsql
    2 
    3 
    4 # 创建链接对象
    5 conn = pymsql.connect('localhost',  'wang', '123456', 'jingdong', 'utf8')
    6 # 创建游标
    7 cur = conn.cursor()
    8 # 执行查询语句
    9 cur.execute('select * from jingdong;')

    执行之后报错

    pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'localhost' ([Errno 10109] getaddrinfo failed)")

    分析报错内容是在提示我无法连接上MySQL服务器,行,就是说我MySQL服务没开启咯。进到服务里面查看了,MySQL服务的启动情况,是正常开启状态的。其实吧,我也觉得不应该是MySQL服务的问题,因为我客户端现在是可以正常链接MySQL的

    网上Google了一番也没有找到任何有价值的资料,所有搜索的词条都是再说你去开启你的MySQL服务。。。。(垃圾信息真多

    不知道从哪儿排查,就试着看下源码吧,是不是参数写错了?这一看还真就发现问题所在,下面我贴出来源码中的初始化方法内容

     1 def __init__(self, host=None, user=None, password="",
     2                  database=None, port=0, unix_socket=None,
     3                  charset='', sql_mode=None,
     4                  read_default_file=None, conv=None, use_unicode=None,
     5                  client_flag=0, cursorclass=Cursor, init_command=None,
     6                  connect_timeout=10, ssl=None, read_default_group=None,
     7                  compress=None, named_pipe=None,
     8                  autocommit=False, db=None, passwd=None, local_infile=False,
     9                  max_allowed_packet=16*1024*1024, defer_connect=False,
    10                  auth_plugin_map=None, read_timeout=None, write_timeout=None,
    11                  bind_address=None, binary_prefix=False, program_name=None,
    12                  server_public_key=None):

     其中参数部分非常明确的告诉了我需要传入一个端口号,否则按照0来处理,好吧,那我就按照顺序重新修改了一遍代码

    1 import pymysql
    2 
    3 
    4 conn = pymysql.connect('127.0.0.1', 'wang', '123456', 'jingdong', 3306, 'utf8')
    5 cursor = conn.cursor()
    6 
    7 print(cursor.execute("select * from goods;"))

    这次总应该没错了吧,执行之后,的确是没有2003的报错code了,但是来了个新的

    AttributeError: module 'socket' has no attribute 'AF_UNIX'

    行吧!!!接着看源码,才发现其实是我上面的入参方式有问题,我是按照位置传参的,所以我的编码格式‘utf-8’会被分配给了 参数‘unix_socket’。。。。重新修一下,添加上参数名,不再使用位置传参

     
    1 import pymysql
    2 
    3 
    4 conn = pymysql.connect(host='127.0.0.1', user='wang', password='123456', database='jingdong', port=3306, charset='utf8')
    5 cursor = conn.cursor()
    6 
    7 print(cursor.execute("select * from goods;"))

    结果又开始报另一个错误了T_T

    RuntimeError: cryptography is required for sha256_password or caching_sha2_password

    继续分析报错,实在提示我啥啥啥密码是需要一个cryptography,这是个什么鬼东西?

    原来是一个跟密码相关的模块,好像是MySQL8.0才会需要。。。。(我为什么要把数据库更新到8T_T

    python安装这个模块,这里又有个小插曲,pip命令在线安装报错!!!(此处是吐槽功夫墙)最后是下载了离线包,离线安装成功

    bingo!!!代码顺利执行,结果完美显示

    超全面的测试IT技术课程,0元立即加入学习!有需要的朋友戳:
    腾讯课堂测试技术学习地址

    作者:树山
    出处: https://www.cnblogs.com/treemountain/
    欢迎转载,但未经作者同意请保留此段声明,并在文章页面明显位置给出原文链接。
  • 相关阅读:
    面试8:找二叉树的下个结点
    面试8:找二叉树的下个结点
    面试题7:重建二叉树
    面试题7:重建二叉树
    Kenneth A.Lambert著的数据结构(用python语言描述)的第一章课后编程答案
    基础的Mapgis三维二次开发-插件式
    面试题6:从尾到头打印链表
    C语言中声明和定义详解(待看。。
    面试题5:替换空格
    面试题5:替换空格
  • 原文地址:https://www.cnblogs.com/treemountain/p/12504582.html
Copyright © 2011-2022 走看看