python的DBUtils连接mysql数据库时报错:2006, 'SSL connection error: SSL_CTX_set_tmp_dh failed'

如下会打开一个mysql数据库连接池会报错:

_mysql_exceptions.OperationalError: (2006, 'SSL connection error: SSL_CTX_set_tmp_dh failed')

import MySQLdb
from MySQLdb.cursors import DictCursor
from DBUtils.PooledDB import PooledDB

# 1号数据库
db_3306 = {
            'host': 'localhost',
            'port': 3306,
            'user': 'root',
            'password': 'macmysql',
            'charset': 'utf8'
}
# 2号数据库
db_3307 = {
            'host': '127.0.0.1',
            'port': 3306,
            'user': 'root',
            'password': 'macmysql',
            'charset': 'utf8'
}


class Mysql(object):
    """
        MYSQL数据库对象,负责产生数据库连接 , 此类中的连接采用连接池实现
        获取连接对象:conn = Mysql.__getConn()
        释放连接对象:conn.close()或del conn
    """
    # 连接池对象
    __pool = None

    def __init__(self, db_name='', port=None):
        """数据库构造函数,从连接池中取出连接,并生成操作游标"""
        if port == 3306:
            db_config = db_3306
        elif port == 3307:
            db_config = db_3307
        else:
            raise("没有这个端口")
        self._conn = Mysql.__getConn(db=db_name, **db_config)

    @staticmethod
    def __getConn(**db_config):
        """静态方法,从连接池中取出连接"""
        if Mysql.__pool is None:
            __pool = PooledDB(creator=MySQLdb, mincached=1, maxcached=10,
                              blocking=True, maxusage=10000, **db_config)
        print(__pool)
        return __pool

    def executeSql(self, command, param=None):
        """执行sql语句,针对读操作返回结果集"""
        try:
            conn = self._conn.connection()
            cursor = conn.cursor(cursorclass=DictCursor)
            cursor.execute(command, param)
            records = cursor.fetchall()
            print(records)
            return records
        except:
            raise


if __name__ == "__main__":
    log_db = Mysql(db_name="log", port=3307)
    command = "SELECT table_name as tab_name FROM information_schema.tables where table_schema ='log'"
    try:
        tables = log_db.executeSql(command=command)
    except Exception as e:
        print('报错', e)

花了一天的时间搜索+测试:

原因在于,'host': '127.0.0.1',把 '127.0.0.1'换成 'localhost'就可以了。

原理不是很清楚,有大神路过可以补充一下,以后找到再补充进来。

--------------------------------------------------分割线--------------------------------------------------

补充:前因后果:https://blog.csdn.net/Daletxt/article/details/88033820

 

参考资料:

https://my.oschina.net/zhouguanghu/blog/32422

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值