今天终于解决了使用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. 所有线程共用一个连接池,需要考虑线程总数和连接池连接数上限的问题
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
3.查看python安装位置以及已经安装的库
cmd——>where python