cx_ORACLE结果表头,cx_Oracle用yield返回结果问题

# #!/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有关)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值