You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

53 lines
1.9 KiB

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2023/4/4 18:33
# @Author : old tom
# @File : connector_factory.py
# @Project : futool-db
# @Desc : 连接器工厂
import hashlib
from common.fudb.connectors.dialect.dialect_connector import OracleConnector, PostgresqlConnector
from datahub.datasource.constant import ds_conf_param
from urllib.parse import quote_plus as urlquote
from common.fudb.connectors.connector_cache import connector_cache
class ConnFactory(object):
"""
数据库连接器工厂
"""
CONNECTION_CONTAINER = {
'oracle': OracleConnector,
'postgresql': PostgresqlConnector
}
def __init__(self, conf: ds_conf_param):
self.db_type = conf.db_type
# 生成连接ID
self.connector_id = self._gen_connector_id(conf.db_type, conf.user, conf.password, conf.host, conf.port,
conf.database)
# 尝试从缓存获取
if connector_cache.exist(self.connector_id) and connector_cache.get(self.connector_id):
self.connector = connector_cache.get(self.connector_id)
else:
# urlquote 用于处理密码中的特殊字符例如@
self.connector = self.CONNECTION_CONTAINER[self.db_type](conf.user, urlquote(conf.password), conf.host,
conf.port, conf.database)
connector_cache.set(self.connector_id, self.connector)
def get_conn(self):
"""
获取连接
:return:
"""
return self.connector.get_conn()
@staticmethod
def _gen_connector_id(db_type, user, password, host, port, database):
# 保证相同输入下MD5计算结果一致
md5 = hashlib.md5()
md5.update(
(db_type + user + password + host + str(port) + password + database).encode(encoding='utf-8'))
return md5.hexdigest()