Python cx_Oracle

来源:这里教程网 时间:2026-02-17 09:47:40 作者:

Python cx_Oracle

什么是cx_Oracle

cx_Oracle 是 Python 语言与 Oracle 数据库进行交互的一个开源模块。它提供了一个 Python DB API 2.0 兼容的接口,可以让开发者在 Python 中连接、查询和操作 Oracle 数据库。

安装cx_Oracle

在开始使用 cx_Oracle 之前,我们需要先安装它。可以通过 pip 来安装 cx_Oracle 模块,命令如下:

pip install cx_Oracle

连接到Oracle数据库

在使用 cx_Oracle 之前,我们需要先建立与 Oracle 数据库的连接。下面是一个简单的示例代码:

import cx_Oracle# 连接到Oracle数据库connection = cx_Oracle.connect("username", "password", "hostname:port/service_name")# 关闭连接connection.close()

在上面的示例中,我们使用 cx_Oracle.connect() 方法来建立与 Oracle 数据库的连接。需要传入用户名、密码和数据库的主机名、端口号以及服务名。

执行SQL查询

一旦建立了与数据库的连接,我们就可以执行 SQL 查询了。下面是一个简单的示例代码:

import cx_Oracle# 连接到Oracle数据库connection = cx_Oracle.connect("username", "password", "hostname:port/service_name")# 创建游标cursor = connection.cursor()# 执行查询cursor.execute("SELECT * FROM employees")# 获取查询结果for row in cursor:    print(row)# 关闭游标cursor.close()# 关闭连接connection.close()

在上面的示例中,我们使用 cursor.execute() 方法执行了一个简单的查询语句,并使用 for 循环遍历了查询结果。

插入数据

除了查询数据,我们还可以向数据库中插入数据。下面是一个插入数据的示例代码:

import cx_Oracle# 连接到Oracle数据库connection = cx_Oracle.connect("username", "password", "hostname:port/service_name")# 创建游标cursor = connection.cursor()# 插入数据cursor.execute("INSERT INTO employees (id, name) VALUES (1, 'Alice')")# 提交事务connection.commit()# 关闭游标cursor.close()# 关闭连接connection.close()

在上面的示例中,我们使用 cursor.execute() 方法插入了一条数据,并使用 connection.commit() 提交了事务。

更新数据

更新数据也是常见的操作之一。下面是一个更新数据的示例代码:

import cx_Oracle# 连接到Oracle数据库connection = cx_Oracle.connect("username", "password", "hostname:port/service_name")# 创建游标cursor = connection.cursor()# 更新数据cursor.execute("UPDATE employees SET name = 'Bob' WHERE id = 1")# 提交事务connection.commit()# 关闭游标cursor.close()# 关闭连接connection.close()

在上面的示例中,我们使用 cursor.execute() 方法更新了一条数据,并使用 connection.commit() 提交了事务。

删除数据

最后,我们还可以删除数据库中的数据。下面是一个删除数据的示例代码:

import cx_Oracle# 连接到Oracle数据库connection = cx_Oracle.connect("username", "password", "hostname:port/service_name")# 创建游标cursor = connection.cursor()# 删除数据cursor.execute("DELETE FROM employees WHERE id = 1")# 提交事务connection.commit()# 关闭游标cursor.close()# 关闭连接connection.close()

在上面的示例中,我们使用 cursor.execute() 方法删除了一条数据,并使用 connection.commit() 提交了事务。

使用绑定变量

在执行 SQL 查询时,我们可以使用绑定变量来提高性能和安全性。下面是一个使用绑定变量的示例代码:

import cx_Oracle# 连接到Oracle数据库connection = cx_Oracle.connect("username", "password", "hostname:port/service_name")# 创建游标cursor = connection.cursor()# 使用绑定变量查询数据id = 1cursor.execute("SELECT * FROM employees WHERE id = :id", id=id)# 获取查询结果for row in cursor:    print(row)# 关闭游标cursor.close()# 关闭连接connection.close()

在上面的示例中,我们使用了 :id 绑定变量来查询指定 id 的数据。

使用事务

在操作数据库时,通常会涉及到事务的处理。下面是一个使用事务的示例代码:

import cx_Oracle# 连接到Oracle数据库connection = cx_Oracle.connect("username", "password", "hostname:port/service_name")# 开始事务connection.begin()# 创建游标cursor = connection.cursor()# 插入数据cursor.execute("INSERT INTO employees (id, name) VALUES (2, 'Charlie')")# 提交事务connection.commit()# 关闭游标cursor.close()# 关闭连接connection.close()

在上面的示例中,我们使用 connection.begin() 开始了一个事务,并在操作完成后使用 connection.commit() 提交了事务。

错误处理

在操作数据库时,可能会出现各种错误,我们需要进行错误处理。下面是一个简单的错误处理示例代码:

import cx_Oracletry:    # 连接到Oracle数据库    connection = cx_Oracle.connect("username", "password", "hostname:port/service_name")    # 创建游标    cursor = connection.cursor()    # 执行查询    cursor.execute("SELECT * FROM employees")    # 获取查询结果    for row in cursor:        print(row)    # 关闭游标    cursor.close()except cx_Oracle.DatabaseError as e:    error, = e.args    print("Oracle-Error-Code:", error.code)    print("Oracle-Error-Message:", error.message)finally:    # 关闭连接    connection.close()

在上面的示例中,我们使用 try-except-finally 结构来处理可能出现的数据库错误。

使用连接池

在实际应用中,为了提高性能和资源利用率,我们可以使用连接池来管理数据库连接。下面是一个使用连接池的示例代码:

import cx_Oraclefrom cx_Oracle import Connection, SessionPool# 创建连接池pool = SessionPool("username", "password", "hostname:port/service_name", min=2, max=5, increment=1)# 从连接池获取连接connection: Connection = pool.acquire()# 创建游标cursor = connection.cursor()# 执行查询cursor.execute("SELECT * FROM employees")# 获取查询结果for row in cursor:    print(row)# 关闭游标cursor.close()# 释放连接回连接池pool.release(connection)

在上面的示例中,我们使用 SessionPool 类创建了一个连接池,并使用 pool.acquire() 方法从连接池中获取连接。

使用批量插入

在需要插入大量数据时,我们可以使用批量插入来提高性能。下面是一个批量插入的示例代码:

import cx_Oracle# 连接到Oracle数据库connection = cx_Oracle.connect("username", "password", "hostname:port/service_name")# 创建游标cursor = connection.cursor()# 批量插入数据data = [(3, 'David'), (4, 'Eve'), (5, 'Frank')]cursor.executemany("INSERT INTO employees (id, name) VALUES (:1, :2)", data)# 提交事务connection.commit()# 关闭游标cursor.close()# 关闭连接connection.close()

在上面的示例中,我们使用 cursor.executemany() 方法批量插入了多条数据。

使用存储过程

在 Oracle 数据库中,存储过程是一种预先编译的 SQL 代码块,可以在数据库中执行。下面是一个使用存储过程的示例代码:

import cx_Oracle# 连接到Oracle数据库connection = cx_Oracle.connect("username", "password", "hostname:port/service_name")# 创建游标cursor = connection.cursor()# 创建存储过程cursor.execute("""    CREATE OR REPLACE PROCEDURE get_employee_name (id IN NUMBER, name OUT VARCHAR2)    AS    BEGIN        SELECT name INTO name FROM employees WHERE id = id;    END;""")# 调用存储过程id = 1name = cursor.var(cx_Oracle.STRING)cursor.callproc("get_employee_name", [id, name])# 打印结果print(name.getvalue())# 关闭游标cursor.close()# 关闭连接connection.close()

在上面的示例中,我们使用 cursor.execute() 方法创建了一个简单的存储过程,并使用 cursor.callproc() 方法调用了这个存储过程。

使用游标变量

在 Oracle 数据库中,游标变量是一种特殊的数据类型,可以用来存储查询结果集。下面是一个使用游标变量的示例代码:

import cx_Oracle# 连接到Oracle数据库connection = cx_Oracle.connect("username", "password", "hostname:port/service_name")# 创建游标cursor = connection.cursor()# 创建游标变量result = cursor.var(cx_Oracle.CURSOR)# 执行查询cursor.execute("BEGIN OPEN :1 FOR SELECT * FROM employees; END;", [result])# 获取查询结果for row in result.getvalue():    print(row)# 关闭游标cursor.close()# 关闭连接connection.close()

在上面的示例中,我们使用 cursor.var() 方法创建了一个游标变量,并在查询时将其作为参数传入。

使用LOB数据类型

在 Oracle 数据库中,LOB(Large Object)数据类型用来存储大量的文本数据。下面是一个使用LOB数据类型的示例代码:

import cx_Oracle# 连接到Oracle数据库connection = cx_Oracle.connect("username", "password", "hostname:port/service_name")# 创建游标cursor = connection.cursor()# 创建LOB对象clob_data = cursor.var(cx_Oracle.CLOB)clob_data.setvalue(0, "This is a CLOB data from geek-docs.com")# 插入LOB数据cursor.execute("INSERT INTO lob_table (id, clob_column) VALUES (1, :clob_data)", clob_data=clob_data)# 提交事务connection.commit()# 关闭游标cursor.close()# 关闭连接connection.close()

在上面的示例中,我们使用 cursor.var() 方法创建了一个 CLOB 对象,并将其插入到数据库中。

使用连接字符串

除了在 cx_Oracle.connect() 方法中传入用户名、密码等参数外,我们还可以使用连接字符串来连接到数据库。下面是一个使用连接字符串的示例代码:

import cx_Oracle# 连接字符串dsn = cx_Oracle.makedsn("hostname", "port", service_name="service_name")connection = cx_Oracle.connect(user="username", password="password", dsn=dsn)# 创建游标cursor = connection.cursor()# 执行查询cursor.execute("SELECT * FROM employees")# 获取查询结果for row in cursor:    print(row)# 关闭游标cursor.close()# 关闭连接connection.close()

在上面的示例中,我们使用 cx_Oracle.makedsn() 方法创建了一个 DSN(Data Source Name)字符串,并将其作为参数传入 cx_Oracle.connect() 方法。

使用连接上下文管理器

在 Python 中,我们可以使用上下文管理器来管理资源,包括数据库连接。下面是一个使用连接上下文管理器的示例代码:

import cx_Oracle# 连接上下文管理器with cx_Oracle.connect("username", "password", "hostname:port/service_name") as connection:    with connection.cursor() as cursor:        # 执行查询        cursor.execute("SELECT * FROM employees")        # 获取查询结果        for row in cursor:            print(row)

在上面的示例中,我们使用 with 语句创建了一个连接上下文管理器,确保在退出代码块时自动关闭连接和游标。

总结

在本文中,我们详细介绍了如何使用 cx_Oracle 模块在 Python 中连接、查询和操作 Oracle 数据库。我们学习了如何连接到数据库、执行 SQL 查询、插入、更新和删除数据,以及使用绑定变量、事务、错误处理、连接池、批量插入、存储过程、游标变量、LOB 数据类型、连接字符串和连接上下文管理器等功能。

相关推荐