python连接mysql数据库——版本问题
今天终于解决了使用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