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


2019.3.1
anacondaの問題で、opensslパッケージの問題で、openssl 1.1.1 a以上のバージョンでは2026バグが発生し、1.0.2 r以下に降格して解決する.
リファレンスhttps://github.com/ContinuumIO/anaconda-issues/issues/10646ここです.
-------------------------------------------------------------------------------------------------------------
2019.2.28
前回、pythonのDBUtils接続mysqlデータベースタイムズエラー:2006,'SSL connection error:SSL_CTX_set_tmp_dh failed'というバグが解決したばかりで、またこのようなバグが出て、しばらく検索して、anacondaを使ったせいかもしれないという人がいました.
2日間の検索+試験を経て、確かにanacondaの問題だが、具体的な原因はまだ分からない.
私の環境は:macOS Mojave 10.14.3+anaconda 4.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を解決するために、このパッケージのインストール過程は、心の中で3波の無数の草泥馬が奔走している.
第1波、windowsにて、そのmysqlclient‑1.4.2‑cp 37‑cp 37 m‑win_amd64.whl(ここの37は対応するpytohn 3.7で、他のバージョンは対応する.whlを探しています)パッケージを手動でインストールします.
第2波、Linux上、通過
pip install mysqlclient

できます.
この第3波、Mac上、Reason:image not found、今回のバグはここを参考にします.
ピット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