MySQLdb._exceptions.OperationalError: (2026, 'SSL connection error: SSL_CTX_set_tmp_dh failed')

2019.3.1

是anaconda的问题,是openssl包的问题,openssl1.1.1a及以上版本会出现2026bug,降级到1.0.2r及以下可解决。

参考https://github.com/ContinuumIO/anaconda-issues/issues/10646这里。

--------------------------------------------------终极分割线--------------------------------------------------

2019.2.28

接上回,python的DBUtils连接mysql数据库时报错:2006, 'SSL connection error: SSL_CTX_set_tmp_dh failed'这个bug刚解决,又出这么个bug,搜索了好一会,有人讲可能是因为用anaconda的原因。

经过两天搜索+试验,确实是anaconda的问题,不过具体原因仍然未知。

我的环境是:macOS Mojave 10.14.3 + anaconda4.6.7(通过conda -V查看的)对应的Python版本是3.6.7

使用的第三方包是:DBUtils + mysqlclient(MySQLdb)

记录下踩过的坑:

要知道是不是anaconda的问题,先要安装其他版本的Python,Python官网下载安装多版本嫌环境变量设置麻烦,用pyenv。

but 坑1:Mac安装pyenv:https://blog.csdn.net/Daletxt/article/details/88036637

坑2:Mac MySQLdb 的安装:

Python3.X为了解决import MySQLdb,此包安装过程,心中有 三波 无数只草泥马奔腾而过。

第一波,windows上,要去这里边下载那个 mysqlclient‑1.4.2‑cp37‑cp37m‑win_amd64.whl (这里的37是对应的pytohn3.7,其他版本就找对应的.whl)包然后手动安装;

第二波,Linux上,通过

pip install mysqlclient

即可;

这第三波,Mac上,Reason: image not found,此次的bug参考这里。

踩过了坑1和坑2,终于运行上了以下代码。

# -*- coding: UTF-8 -*-
import MySQLdb
from MySQLdb.cursors import DictCursor
from DBUtils.PooledDB import PooledDB

# 远程数据库
db_168_3306_config = {
            'host': 'x.x.x.x',
            'port': 3306,
            'user': 'x',
            'password': 'x',
            'charset': 'utf8mb4'
}


class SqlHelper(object):
    __pool = None
    def __init__(self, db_name='', port=3306):
        self._conn = SqlHelper.__getConn(db=db_name, **db_config)

    @staticmethod
    def __getConn(**db_config):
        if SqlHelper.__pool is None:
            __pool = PooledDB(creator=MySQLdb, mincached=0, maxcached=10, blocking=True, maxshared=10, maxusage=10000, **db_config)
        return __pool

    def executeSql(self, command, param=None):
        try:
            conn = self._conn.connection()
            cursor = conn.cursor(cursorclass=DictCursor)
            cursor.execute(command, param)
            records = cursor.fetchall()
            return records
        except:
            raise

    def get(self, table_name, fields=None, cond_dict=None):
        if isinstance(fields, (list, tuple)):
            fields_sql = ",".join(fields)
        elif isinstance(fields, str):
            fields_sql = fields

        if isinstance(cond_dict, dict):
            cond = [key+"=%s" for key in cond_dict.keys()]
            cond_sql = " and ".join(cond)
            sql = 'select {} from {} where {}'.format(fields_sql, table_name, cond_sql)
            return self.executeSql(sql, tuple(cond_dict.values()))
        elif cond_dict is None:
            sql = 'select {} from {}'.format(fields_sql, table_name)
            return self.executeSql(sql)


if __name__ == "__main__":
    db = SqlHelper(db_name='xxx')
    result = db.get(table_name="xxx", fields="xxx")
    mid = [i.get("xxx") for i in result]
    print(len(mid), mid)

此代码在windows上可以连上远程数据库。

Mac上的这玩意就连不上远程数据库,报错如题,但是可以连上本地数据库,但是如果'localhost'换成'127.0.0.1'就报错2006。

db_local_config = {
            'host': 'localhost',
            'port': 3306,
            'user': 'x',
            'password': 'x',
            'charset': 'utf8mb4'
}

为什么是anaconda的问题,待继续研究解决。

 

参考资料:

https://www.jianshu.com/p/cea9259d87df

https://blog.csdn.net/Ashimar_a/article/details/80431171

https://github.com/ContinuumIO/anaconda-issues/issues/10646

 

你可能感兴趣的:(mac,mysql,python)