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有关)

阅读 923
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题