编译python为可执行文件遇到的问题:使用python-oracledb连接oracle数据库时出现错误:DPY-3010

错误原文:
DPY-3010: connections to this database server version are not supported by python-oracledb in thin mode
链接数据库方式如下:
connection=create_engine("oracle+oracledb://user:password@host:post/dbname")

 

PyCharm编译器内运行成功但编译后会有DPY-3010无法使用的情况。经排查和阅读python-oracledb使用文档,发现:
Python-oracledb 的默认精简模式可以连接到 Oracle 数据库 12.1 或更高版本。如果要连接到 Oracle 数据库 11.2,则需要通过在代码中调用 oracledb.init_oracle_client() 来启用厚模式。
我是这样做的:
检查我要连接的oracle数据库版本:

因为是企业的正式数据库,我不想造成太大风险,所以我不升级数据库版本:

要获得更新的Oracle 数据库 XE 版本,请参阅 https://www.oracle.com/au/database/technologies/xe-downloads.html

我在导入oracledb后引入了下面的厚模式,但编译后仍会有DPY-3010的报错  

import oracledb  

oracledb.init_oracle_client(lib_dir=r"C:\Oracle\Instant Client\bin")

C:\Oracle\Instant Client\bin 是oracle安装的主目录,我是从我本机的PL/SQL工具的首选项中查到的。这是连接oracle数据库的即时客户端工具,每台电脑安装的位置都有可能不一样。

我后来经过反复验证和阅读Python-oracledb手册发现create_engine("oracle+oracledb...在用法中已弃用。

所以我采用了连接池的方式实现了功能。完整代码如下:

import oracledb

oracledb.init_oracle_client(lib_dir=r"C:\Oracle\Instant Client\bin")  # 针对oracle11.2的老版本需要采用这种厚模式
# 使用连接池的方法,目的是可以提高数据库的性能
# 初始化连接
pool = oracledb.create_pool(user="user", password='password', dsn="host:post/dbname",
                            min=2, max=5, increment=1)


# Acquire 连接到池
oapool = pool.acquire()
# 使用连接池
with oapool.cursor() as cursor:
    for result in cursor.execute("select * from test"):
        print(result)

# 释放连接池
pool.release(oapool)

# 关闭连接池
pool.close()

编译成可执行文件时,我也走了很多弯路。

首先是pyinstaller工具,因为对于一些第三方包以及oracledb依赖环境不能一起打包,导致编译后放在其他电脑上没有依赖环境无法运行,这里我走了很多弯路,pyinstaller是有点坑。

经过摸索我安装并测试使用了cxfreeze工具,目前基本可以满足依赖环境的一起打包。cmd命令如下:

cxfreeze main.py --target-dir dist --base-name="win32gui"

引导主程序:main.py
新建dist文件夹并将最终main所依赖程序打包在该目录下:--target-dir dist
隐藏cmd控制台的参数:--base-name="win32gui"

 

cxfreeze安装完成后在python安装目录的Scripts下应该有下面三个文件:

 

cxfreeze我用的是目前最新的版本6.16

cxfreeze 6.16.0-dev2 Copyright (c) 2020-2023 Marcelo Duarte.

安装成功后会在Scripts生成最下面两个文件。

第一个文件是我直接从https://download.lfd.uci.edu/pythonlibs/archived/cx_Freeze-6.11.1-cp310-cp310-win_amd64.whl下好放在Scripts下的。

命令行下运行cxfreeze-h可以看的相关参数和版本号。cxfreeze安装方法我会在下一篇文章里做一下总结。

 

参考链接:https://www.52dianzi.com/category/article/1dd154d83d77de2073abfc71b32b9aa0.html

 

posted @ 2023-06-30 18:24  三生有幸格格  阅读(2397)  评论(2编辑  收藏  举报