• 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 "......pymysqlconnections.py", line 678, in __init__
        self.connect()
      File "......pymysqlconnections.py", line 890, in connect
        self._request_authentication()
      File "......pymysqlconnections.py", line 1097, in _request_authentication
        auth_packet = self._read_packet()
      File "......pymysqlconnections.py", line 965, in _read_packet
        packet.check_error()
      File "......pymysqlconnections.py", line 394, in check_error
        err.raise_mysql_exception(self._data)
      File "......pymysqlerr.py", line 120, in raise_mysql_exception
        _check_mysql_exception(errinfo)
      File "......pymysqlerr.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

  • 相关阅读:
    重定向 重写
    php 安装 event 和 libevent 扩展
    curl 和 tcpdump
    yum 升级php版本
    shell 教程
    shell脚本 inotify + rsync 同步脚本
    nodesj中 中间件express-session的理解
    node.js中express-session配置项详解
    我对面向对象的理解
    BootstrapValidator
  • 原文地址:https://www.cnblogs.com/Qi77/p/12496822.html
Copyright © 2020-2023  润新知