# #!/usr/bin/python
# # -*- coding: UTF-8 -*-
import cx_Oracle
class Oracle:
"""Oracle连接类,先执行conn连接上服务器,然后执行exec()或者insertBatch()方法,最后执行close关闭所有连接"""
def __init__(self,host,username,pwd,port,db):
super(Oracle,self).__init__()
self.__host=host
self.__username=username
self.__pwd=pwd
self.__port=int(port) if port and str(port).isdigit() else 1521
self.__db=db
self.fields = []
self.__conn_info=None
def __enter__(self):
self.conn
def __exit__(self, exc_type, exc_val, exc_tb):
self.close
@property
def conn(self):
oracle_tns = cx_Oracle.makedsn(self.__host, self.__port, self.__db)
try:
self.__conn_info = cx_Oracle.connect(self.__username, self.__pwd, oracle_tns)
except Exception as e:
return f'Error:{e}'
######执行单个sql,首先要执行conn方法确保连接上服务器,最后执行close关闭连接
def exec(self,sql,*args):
######判断conn是否执行成功
if self.__conn_info:
try:
######游标
self.__cursor = self.__conn_info.cursor()
self.__cursor.execute(sql, args)
result = self.__cursor.fetchall()
if result:
for row in result:
result_list_tmp = []
for i in row:
if isinstance(i, (cx_Oracle.LOB, cx_Oracle.BLOB, cx_Oracle.CLOB)):
i = i.read()
result_list_tmp.append(str(i).strip() if i != None else '')
yield result_list_tmp
else:
return {}
except Exception as e:
self.__conn_info.rollback()
return 'Error: %s'%str(e)
else:
return 'Error'
@property
def close(self):
try:
self.__cursor.close()
cursor_close='closed'
except:
cursor_close='has been closed down'
try:
self.__conn_info.close()
conn_close='closed'
except:
conn_close='has been closed down'
return {'cursor':cursor_close,'conn':conn_close}
if __name__=='__main__':
Ora=Oracle(host='localhost',username='orcl',pwd='orcl',port=1521,db='orcl')
with Ora:
r=Ora.exec("select 1 name,1 num from dual union select 2,2 from dual")
for i in r:
print(i)
以上,结果用yield返回后,如果把for循环放在with里面就可以,放在with外面就报错,求大神看看怎么把放在外面不报错(好像跟close有关)