You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:55:18