如下会打开一个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