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

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

时间:2023-06-30 18:33:24浏览次数:59  
标签:python 3010 oracledb Oracle cxfreeze oracle 数据库

错误原文:
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() 来启用厚模式。 请参阅用户文档 https://python-oracledb.readthedocs.io/en/latest/user_guide/initialization.html#enabling-python-oracledb-thick-mode 我是这样做的: 检查我要连接的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

 

标签:python,3010,oracledb,Oracle,cxfreeze,oracle,数据库
From: https://www.cnblogs.com/mylive/p/17517589.html

相关文章

  • 为什么Python Selenium获取的Cookie不完整?
    在某些情况下,使用PythonSelenium访问网页并尝试获取Cookie时,可能会发现获取到的Cookie不完整。具体而言,期望获取的Cookie键值对数量与实际获取的数量不符。类似这个uu的问题:目前情况下,PythonSelenium获取的Cookie不完整可能的原因有几个:1.在获取Cookie之前,网页内容可能还未完全加......
  • python 队列简单实现
    1classQueuryExcept(Exception):...23classLinkNode:4def__init__(self,value:int,next=None):5self.value:int=value6self.next:LinkNode=next78def__repr__(self)->str:9li=[se......
  • python 编写远程连接服务器脚本
    importparamikoclient=paramiko.SSHClient()client.set_missing_host_key_policy(paramiko.AutoAddPolicy())client.connect('10.116.33.116',username='root',password='123456')stdin,stdout,stderr=client.exec_command('......
  • 《最新出炉》系列初窥篇-Python+Playwright自动化测试-5-元素定位大法-上篇
    1.简介说到元素定位,小伙伴或者童鞋们肯定会首先想到selenium的八大元素定位大法。同理Playwright也有自己的元素定位的方法。今天就给小伙伴或者童鞋们讲解和分享一下Playwright的元素定位方法。宏哥对UI自动化的理解:定位元素--->操作元素---->断言。2.定位器定位器(Locator)......
  • Django使用python的view创建a标签
    1、views文件deftestaa(request):#aa=[]foriinrange(1,10):aa='<ahref="">test</a>'aa='<ahref="http://www.baidu.com">百度链接</a></br>'#bb="<a......
  • Python运行时发生错误如何快速解决?
    撰写完Python程序后,很多人在执行过程中就会遇到运行错误的情况,但又搞不懂错误在哪,从而感到崩溃且不知所措,那么Python运行时发生错误如何应对?这篇文章教你解决方法!1、了解Python运行时错误在Python中,当代码执行时出现错误,在程序运行时而不是编译时就被称为运行时错误......
  • Python学习入门,从19个语法开始!
    Python简单易学,但又博大精深。许多人号称精通Python,却不会写Pythonic的代码,对很多常用包的使用也并不熟悉。学海无涯,我们先来了解一些Python中最基本的内容。Python的特点解释型语言,无需编译即可运行提供了交互式命令行基于对象的编程思想跨平台和良好的兼容性,在Windows、Mac、Linu......
  • python内置函数:chr()、ord()使用方法及练习
    python内置函数:chr()、ord()使用方法及练习使用方法由于chr函数和ord函数经常是一起出现、一起使用的,所以我将它们放到同一篇文章。一、chrchr({需要转换的Unicode编码}),返回值是对应的字符例1:输入数字65-91,返回值是大写字母chr(65)Achr(90)Z......
  • Python中print(__doc__)作用的教程
      2、......
  • python3的django创建api通过Postman进行端口测试
    1、打开pycharm创建工程及app  创建url  创建views函数:  fromdjango.shortcutsimportrender#Createyourviewshere.fromdjango.viewsimportViewfromdjango.utils.decoratorsimportmethod_decoratorfromdjango.views.decorators.csrfimportcsrf_exemptfr......