hejialiangya 发表于 2023-3-22 09:58:40

oracledb如何使用thick模式

python3.11.2++pyqt6+pyside6,由于cx_oracle8.3不更新,故升级应用oracledb 1.2.2
在连接oracle11.2远程服务器时,提示DPY-3010: connections to this database server version are not supported by python-oracledb in thin mode
经查Python-oracledb的thin模式可以连接到 Oracle 数据库 12.1 或更高版本。如果想连接到 Oracle Database 11.2,您需要通过以下方式启用thick模式在您的代码中调用oracledb.init_oracle_client()。
查阅官方文档后还是不能完全吃透
有大神可以教教我oracledb.init_oracle_client()该如何调用成功吗?

---------------DBConnect.py如下------------------------
from oracledb importConnection
oracledb.init_oracle_client()    #这里thick模式我不知道怎么写了
# 连接oracle数据库
conn = Connection(
    host="130.1.25.99",
    port=1521,
    user="ZYY",
    password="2023@KAV",
    service_name="orcl"
)
cursor = conn.cursor()
cursor.execute("select name,user_name,password from staff_dict")
results = cursor.fetchall()
print(results)
conn.close()

ouyunfu 发表于 2023-3-22 10:10:29

试试如下代码:import cx_Oracle
import os

# 设置Oracle客户端路径
os.environ["PATH"] += ";C:\\oracle\\instantclient_11_2"

# 初始化Oracle客户端
cx_Oracle.init_oracle_client(lib_dir=r"C:\oracle\instantclient_11_2")

# 建立数据库连接
dsn = cx_Oracle.makedsn(host='130.1.25.99', port=1521, sid='orcl')
conn = cx_Oracle.connect(user='ZYY', password='2023@KAV', dsn=dsn)

# 执行SQL查询
cursor = conn.cursor()
cursor.execute("SELECT name, user_name, password FROM staff_dict")
results = cursor.fetchall()
print(results)

# 关闭数据库连接
cursor.close()
conn.close()

hejialiangya 发表于 2023-3-22 10:26:34

本帖最后由 hejialiangya 于 2023-3-22 10:39 编辑

ouyunfu 发表于 2023-3-22 10:10
试试如下代码:

感谢大哥回复,不过我cx_oracle装不上。我按你的试了试oracledb的方法
DPI-1047: Cannot locate a 64-bit Oracle Client library: "The specified module could not be found"

我不太理解这两段
# 设置Oracle客户端路径
os.environ["PATH"] += ";C:\\oracle\\instantclient_11_2"
# 初始化Oracle客户端
cx_Oracle.init_oracle_client(lib_dir=r"C:\oracle\instantclient_11_2")
的语法,
路径是固定语法,还是根据自己电脑里的路径调整?

isdkz 发表于 2023-3-22 10:42:23

为了启用thick模式,你需要使用oracledb.init_oracle_client()函数并传递一个包含客户端库路径的参数。这里是你需要做的:

确保你已安装了Oracle客户端库。对于Oracle 11.2,你需要使用Oracle Instant Client 11.2。你可以从这里下载它:https://www.oracle.com/database/technologies/instant-client/downloads.html

解压下载的Instant Client,并记下解压后的文件夹路径。你需要这个路径来初始化init_oracle_client()函数。

接下来,你需要修改DBConnect.py文件,如下所示:

from oracledb import Connection
import os

# 这里替换为实际的Oracle Instant Client 11.2的路径
oracle_instant_client_path = "/path/to/instantclient_11_2"

# 设置环境变量,以便找到Oracle Instant Client
os.environ["PATH"] = oracle_instant_client_path + os.pathsep + os.environ["PATH"]

# 初始化Oracle客户端,启用thick模式
oracledb.init_oracle_client(lib_dir=oracle_instant_client_path)

# 连接oracle数据库
conn = Connection(
    host="130.1.25.99",
    port=1521,
    user="ZYY",
    password="2023@KAV",
    service_name="orcl"
)
cursor = conn.cursor()
cursor.execute("select name,user_name,password from staff_dict")
results = cursor.fetchall()
print(results)
conn.close()


请确保将oracle_instant_client_path变量设置为你在步骤2中记录的路径。现在,你的代码应该可以在thick模式下与Oracle 11.2数据库建立连接。

hejialiangya 发表于 2023-3-22 12:04:22

本帖最后由 hejialiangya 于 2023-3-23 08:54 编辑

isdkz 发表于 2023-3-22 10:42
为了启用thick模式,你需要使用oracledb.init_oracle_client()函数并传递一个包含客户端库路径的参数。这里 ...
经大神指点,问题已解决。
期间还有点小插曲,被官方文档误导了,文档说instantclient_12_2可以连接Oracle11.2.0.4及以上,但其实会报DPI-1047: Cannot locate a 64-bit Oracle Client library
需要退版本instantclient_11_2包(Basic+sdk+odbc),环境变量配置好path,tnsnames.ora放入C:\instantclient_11_2。thick模式顺利连接成功。

hejialiangya 发表于 2023-3-23 08:56:51

ouyunfu 发表于 2023-3-22 10:10
试试如下代码:

大哥神了,早知道我直接下instantclient_11_2包,就不用在这小问题上折腾1天了。
页: [1]
查看完整版本: oracledb如何使用thick模式