python连接mysql数据库——版本问题

Posted 祺&Qi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于python连接mysql数据库——版本问题的主要内容,如果未能解决你的问题,请参考以下文章

如何升级到python3版本并且安装pip3及ipython3

寒假学习进度-6(Python连接MySQL数据库)

python怎么连接mysql数据库

Python连接MySQL数据库之pymysql模块使用

Python range 数据类型 [学习 Python 必备基础知识][看此一篇就够了][range()][range 元素元素检测元素索引查找切片负索引][检测 range 对象是否相等](代码片

Python range 数据类型 [学习 Python 必备基础知识][看此一篇就够了][range()][range 元素元素检测元素索引查找切片负索引][检测 range 对象是否相等](代码片