Python多函数中如何获取cx_Oracle连接与游标双返回值
cx_Oracle连接与事务处理优化方案
1. 修改oracle_conn方法返回连接与游标
将原方法改为同时返回数据库连接对象和游标,这样后续可以通过连接控制事务提交:
def oracle_conn(self): con = cx_Oracle.connect('user/password@localhost:1521/xe') cur = con.cursor() return con, cur
2. 在extract方法中获取并使用连接与游标
查询操作无需提交事务,但需注意关闭资源避免泄漏:
def extract(self): conn, cur = self.oracle_conn() try: cur.execute('select * from employees') data = cur.fetchall() return [row for row in data] finally: cur.close() conn.close()
3. 在load方法中处理事务提交
插入操作必须提交事务才能将数据写入数据库,同时增加异常回滚逻辑:
def load(self): values = self.expression() query = 'INSERT INTO hr.employees_python (EMPLOYEE_ID, NAME, EMAIL, ' \ 'PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, MONTH, ' \ 'DAY, YEAR) values (:0, :1, :2, :3, :4, :5, :6, :7, :8, :9)' conn, cur = self.oracle_conn() try: cur.executemany(query, values) conn.commit() # 提交事务,确保数据持久化 except Exception as e: conn.rollback() # 出错时回滚事务,避免脏数据 raise e finally: cur.close() conn.close()
额外优化:使用上下文管理器自动管理资源
可以用with语句简化资源管理,无需手动关闭游标和连接:
def load(self): values = self.expression() query = 'INSERT INTO hr.employees_python (EMPLOYEE_ID, NAME, EMAIL, ' \ 'PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, MONTH, ' \ 'DAY, YEAR) values (:0, :1, :2, :3, :4, :5, :6, :7, :8, :9)' with cx_Oracle.connect('user/password@localhost:1521/xe') as conn: with conn.cursor() as cur: cur.executemany(query, values) conn.commit() # cx_Oracle连接上下文管理器默认不自动提交,需手动调用
内容的提问来源于stack exchange,提问作者Jim Macaulay
相关产品推荐
相关产品推荐

