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!!!代碼順利執行,結果完美顯示

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM