Python连接Oracle数据库:cx_Oracle与oracledb库的比较与选择

一、概述

Python 访问 Oracle可以通过两种Oracle官方库:

旧驱动:cx_Oracle(需要安装Oracle Instant client)

新驱动:oracledb(Oracle数据库12.1或更高版本不需要安装 Oracle Instant client)

cx_Oracle

需要安装 Oracle Instant client(Oracle即时客户端)。

oracledb

GitHub:https://github.com/oracle/python-oracledb

python-oracledb 有两种模式: Thin 和 Thick。

  • 默认模式是Thin,该模式直接连接到 Oracle数据库,不需要Oracle客户端库。
  • Thin模式只支持Oracle数据库12.1或更高版本。
  • Thick模式需要Oracle客户端库。

二、安装Oracle Instant client

官方下载地址:https://www.oracle.com/database/technologies/instant-client/downloads.html

官方安装手册:https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html#installing-cx-oracle-on-macos-intel-x86

截止目前(20240611), 最新版本instantclient-basic-macos.x64-19.16.0.0.0dbru.dmg 客户端经测试可以访问Oracle 11.2.0.2.0。

以下是在macos上安装 instantclient-basic-macos.x64-19.16.0.0.0dbru.dmg 步骤:

cd $HOME/Downloads
# 1.下载 instantclient-basic-macos.x64-19.16.0.0.0dbru.dmg

# 2.挂载下载的DMG文件
双击 instantclient-basic-macos.x64-19.8.0.0.0dbru.dmg

# 3.默认安装在$HOME/Downloads(如果不介意,则完成后直接跳到第 5 步)
复制全部文件到自定义文件夹

# 4.修改安装文件
vim install_ic.sh

DEST=/Users/${USER}/Downloads/instantclient_19_16 
修改为自己创建的目录:
DEST=/Users/wangfugui/home/dev/middleware/数据库/Oracle/instantclient/instantclient_19_16

# 5.安装客户端
sh install_ic.sh

(非必须)如果要安装sdk、sqlplus,按照上面的方法,将文件复制到同一个目录中 instantclient_19_16,修改目录并执行安装。

三、Python测试

cx_Oracle:

需要安装 Oracle Instant client。

import cx_Oracle

cx_Oracle.init_oracle_client(lib_dir="/Users/wangfugui/home/dev/middleware/数据库/Oracle/instantclient/instantclient_19_16")
connection = cx_Oracle.connect(user="oracle", password="oracle",
                               dsn="localhost/XE")

cursor = connection.cursor()
cursor.execute("""
        SELECT first_name, last_name
        FROM employees
        WHERE EMPLOYEE_ID > :did AND EMPLOYEE_ID < :eid""",
        did = 101,
        eid = 104)
for fname, lname in cursor:
    print("Values:", fname, lname)
oracledb:

Oracle数据库12.1或更高版本不需要安装 Oracle Instant client。

import getpass

import oracledb

un = 'oracle'
cs = 'localhost/XE'
pw = getpass.getpass(f'Enter password for {un}@{cs}: ')

with oracledb.connect(user=un, password=pw, dsn=cs) as connection:
    with connection.cursor() as cursor:
        sql = """SELECT * FROM employees"""
        for r in cursor.execute(sql):
            print(r)

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-06-16 04:46:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-16 04:46:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-16 04:46:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-16 04:46:02       18 阅读

热门阅读

  1. Linux系统学习——指令二

    2024-06-16 04:46:02       5 阅读
  2. Python中的函数

    2024-06-16 04:46:02       6 阅读
  3. LoRa模块如何实现智能灌溉系统的精准灌溉

    2024-06-16 04:46:02       8 阅读
  4. LeeCode 1987 DP / Trie

    2024-06-16 04:46:02       9 阅读
  5. 无人机技术的原理和发展

    2024-06-16 04:46:02       5 阅读
  6. oracle打补丁

    2024-06-16 04:46:02       11 阅读
  7. x86计算机的启动初期流程 Linux 启动流程

    2024-06-16 04:46:02       8 阅读
  8. 网络学习(15)|有http/1为什么还会有http/2

    2024-06-16 04:46:02       7 阅读
  9. ceph scrub 错误记录

    2024-06-16 04:46:02       7 阅读
  10. 使用甲骨文云arm服务器安装宝塔时nginx无法卸载

    2024-06-16 04:46:02       8 阅读
  11. docker 容器 network host 模式启动

    2024-06-16 04:46:02       8 阅读
  12. Web前端align的奥秘:深入剖析与实战应用

    2024-06-16 04:46:02       10 阅读