今天終於解決了使用python連接數據庫不成功的問題,現將過程總結如下:
一、出現的問題
在使用python連接mysql數據庫是一直出現如下問題:
1.只能連接到我數據庫中的的第一個數據庫,但是不能操作里面的表,會報錯表不存在。(表是存在的)
2.更換其他數據庫后,直接報錯找不到該數據庫。(數據庫和表均存在)
運行連接數據庫的代碼,會出現:
conn = pymysql.connect(user='root', password='password', database='XXX') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "....\pymysql\__init__.py", line 88, in Connect return Connection(*args, **kwargs) File "......\pymysql\connections.py", line 678, in __init__ self.connect() File "......\pymysql\connections.py", line 890, in connect self._request_authentication() File "......\pymysqlconnections.py", line 1097, in _request_authentication auth_packet = self._read_packet() File "......\pymysql\connections.py", line 965, in _read_packet packet.check_error() File "......\pymysql\connections.py", line 394, in check_error err.raise_mysql_exception(self._data) File "......\pymysql\err.py", line 120, in raise_mysql_exception _check_mysql_exception(errinfo) File "......\pymysql\err.py", line 115, in _check_mysql_exception raise InternalError(errno, errorvalue) pymysql.err.InternalError: (1049, "Unknown database 'XXXX'")
但是通過navicat查看的話,代碼中所用到的數據庫以及表都是存在的。
二、正確的解決方案
最后我發現是自己電腦上的mysql版本沖突問題,由於自己之前安裝mysql的時候安裝了兩次不同版本的,第一次安裝的沒有刪除干凈,所以出現了問題,解決步驟如下:
1.在能連上的那個數據庫,查詢版本;
#!/usr/bin/python3 import pymysql # 打開數據庫連接 db = pymysql.connect("localhost","testuser","test123","TESTDB" ) # 使用 cursor() 方法創建一個游標對象 cursor cursor = db.cursor() # 使用 execute() 方法執行 SQL 查詢 cursor.execute("SELECT VERSION()") # 使用 fetchone() 方法獲取單條數據. data = cursor.fetchone() print ("Database version : %s " % data) # 關閉數據庫連接 db.close()
2.查詢自己navicat查看所用的數據庫版本;
3.兩個數據庫不一致,打開服務,終止運行中的自己並沒有用到的那個MySQL版本;
4.問題解決
三、解決問題過程中遇到的其他知識
1.lock鎖
使用了多線程,如果所有線程共享同一連接,每個execute之前請加上互斥鎖
lock.acquire()
cursor.execute(command,data)
lock.release()
幾種解決方案:
1. 每個線程擁有自己的連接
2. 所有線程共用一個連接,加鎖互斥使用此連接
3. 所有線程共用一個連接池,需要考慮線程總數和連接池連接數上限的問題
來源:https://bbs.csdn.net/topics/392264802?page=1
2.報錯:ModuleNotFoundError: No module named 'fcntl'
新建fncl.py文件(用記事本也行),輸入以下代碼並保存至Python安裝目錄的Lib目錄下
def fcntl(fd, op, arg=0): return 0 def ioctl(fd, op, arg=0, mutable_flag=True): if mutable_flag: return 0 else: return "" def flock(fd, op): return def lockf(fd, operation, length=0, start=0, whence=0): return
來源:https://blog.csdn.net/Myisking/article/details/82320744
3.查看python安裝位置以及已經安裝的庫
cmd——>where python
來源:https://www.cnblogs.com/ExMan/p/9370631.html