# 用于连接Oracle数据库# -*- coding:utf-8 -*-
import cx_Oracle as Oracle
from DBUtils.PooledDB import PooledDB
class OrclPool(object):
"""
1) 这里封装了一些有关oracle连接池的功能;
2) sid和service_name,程序会自动判断哪个有值,
若两个都有值,则默认使用sid;
若只想用其中一个,则只需要把另一个设置为空即可。如,service_name = ''
3) 关于config的设置,只有 port 的值的类型是 int,其他均为str:
"""
def __init__(self, config):
self.conn = OrclPool.__get_conn(config)
self.cur = self.conn.cursor()
@staticmethod
def __get_conn(conf):
"""
一些 PoolDB 中可能会用到的参数,根据实际情况自己选择
mincached: 启动时开启的空连接数量
maxcached: 连接池最大可用连接数量
maxshared: 连接池最大可共享连接数量
maxconnections: 最大允许连接数量
blocking: 达到最大数量时是否阻塞
maxusage: 单个连接最大复用次数
:param conf: dict 连接Oracle的信息
"""
host, port, sid, service_name = conf.get('host'), conf.get('port'), conf.get('sid'), conf.get('service_name')
dsn = None
if sid:
dsn = Oracle.makedsn(host, port, sid=sid)
elif service_name:
dsn = Oracle.makedsn(host, port, service_name=conf.get('service_name'))
__pool = PooledDB(Oracle, user=conf['user'], password=conf['passwd'], dsn=dsn, mincached=1, maxcached=5)
return __pool.connection()
def execute_sql(self, sql, args=None):
"""
执行sql语句
:param sql: str sql语句
:param args: list sql语句参数列表
"""
if args:
self.cur.execute(sql, args)
else:
self.cur.execute(sql)
def fetch_all(self, sql, args=None):
"""
获取全部结果
:param sql: str sql语句
:param args: list sql语句参数
:return: tuple fetch结果
"""
self.execute_sql(sql, args)
return self.cur.fetchall()
def commit_sql(self, sql):
self.cur.execute(sql)
self.conn.commit()
def __del__(self):
"""
在实例资源被回收时,关闭该连接池
"""
self.cur.close()
self.conn.close()
if __name__ == "__main__":
orcl_cfg = {
'user': 'username', # 数据库用户名字
'passwd': 'password', # 数据库密码
'host': '0.0.0.0', # 数据库链接地址
'port': 3000, # 端口
'sid': '',
'service_name': 'tpi2hx', # 数据库名字
}
orcl = OrclPool(orcl_cfg)