配景:工作需要
需求:利用pycharm访问长途oracle类型数据库的表,表中包含lob字段(这也是个坑!)
麻了,搞了一个星期,终于成功了,真可谓是每步都有坑,看的文章也有小一百篇了,我要及时把自己的踩坑路总结出来,盼望对你有效哟~
一、在Pycharm中下载cx_Oracle包
下载安装免费的Pycharm社区版拜见pycharm Mac/windows(2022-2)之下载安装和设置中文
如果加载不成功,利用Anaconda Prompt在自己的环境中下载
我是在Pycharm终端执行如下代码
- pip install -i https://pypi.tuna.tsinghua.edu.cn/simple cx_Oracle
复制代码 然后开开心心运行,本以为到这里就成功结束了
- import cx_Oracle as oracle
- #
- def main():
- # cx_Oracle.connect("用户名 / 密码@ Oracle服务器IP / Oracle的SERVICE_NAME")
- db = oracle.connect('XXX/XXX@IP地址:端口/sid_name')#换成自己远程要连的库
- c = db.cursor() # 获取cursor
- x = c.execute("select * from XXX WHERE XXX") # 使用cursor进行各种查询操作
- rows = c.fetchall()
- for row in rows:
- for v in row:
- print(v)
- c.close() # 关闭cursor
- db.close() # 关闭连接
- if __name__ == '__main__':
- main()
复制代码 然而上来就是个error!
Cannot locate a 64-bit Oracle Client library: “The specified module could not be found”.
开始了漫长而无头绪的检索和阅读和尝试!没用的略过,有效的两步如下:
二、下载orcl instantclient
鉴于我之前已经下载并解压好了instantclient_21_12,如没下载请转至Oracle客户端官网
因为我的pycharm安装的是最新版,电脑也是最新版,无脑拣最新的上~
三、复制3个dll后缀的文件至pychrm环境安装包的位置
以我的为例,我用的是vene环境,可以点文件-设置-python解释器检察当前利用的环境
最简单的方式,把instantclient_21_12中的这三个文件选中复制
直接在pycharm中点开vene/Lib/site_packages,粘贴进来
粘贴完成后,再次运行就成功了,不可的话重启一下pycharm
ps:还不可的话去设置下环境变量
我的到步骤三就OK了,看自己环境
win11桌面右键,随便选一个表现设置/个性化,进入设置弹框页面,输入环境进行搜刮
在用户变量新建一个变量名为instantclient,变量值为instantclient_21_12所在路径的东西
搞完后再次重启pycharm试试
四、查询表并输出数据框情势
- #运行成功
- import cx_Oracle as cx
- import pandas as pd
- def visitOracle(sql):
- # cx_Oracle.connect("用户名 / 密码@ Oracle服务器IP / Oracle的SERVICE_NAME")
- conn = cx.connect('XXX/XXX@IP地址:端口/sid_name')#换成自己远程要连的库
- cursor = conn.cursor()
- cursor.execute(sql) # 使用cursor进行各种操作
- # 读取字段名
- index = cursor.description
- row = list()
- for i in range(len(index)):
- row.append(index[i][0])
- # 获取返回信息
- data = cursor.fetchall()
- result = pd.DataFrame(list(data), columns=row)
- # 关闭链接,释放资源
- cursor.close()
- conn.close()
- return result
- sql = "select * from XXX WHERE XXX'"
- df = visitOracle(sql)
- print(df)
复制代码 如果是普通的表,是运行成功的,鉴于我的表有一个字段是长文本CLOB类型,所以它报错了
cx_Oracle.DatabaseError: DPI-1040: LOB was already closed
步骤五是我尝试成功的解决办法
五、查询含有lob类型字段的表
5.1 在Pycharm中下载sqlalchemy包
- 利用pip install sqlalchemy 和设置那里安装均失败
- SQLAlchemy · PyPI 安装指定版本也失败了
- 利用镜像源安装成功!!
- #pip3 install flask-sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple
- pip3 install sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple
复制代码 5.2 查询数据库并访问表
5.2.1 列表情势输出
输出为外层列表,内里是元组的情势
[(number_value1,clob_value1),(number_value2,clob_value2),(number_value2,clob_value2)]
- import cx_Oracle
- # 连接到Oracle数据库
- dsn = cx_Oracle.makedsn('YOUR_HOST', 'YOUR_PORT', service_name='YOUR_SERVICE_NAME')
- conn = cx_Oracle.connect(user='YOUR_USERNAME', password='YOUR_PASSWORD', dsn=dsn)
- # 查询SQL
- query = "select {number_column}, {clob_column} FROM {table_name} where rownum<=5"
- # 执行查询
- cursor = conn.cursor()
- cursor.execute(query)
- # 获取所有行
- rows = cursor.fetchall()
- print(rows)
- #获取所有行也可以换成如下,输出结果是一样的
- for row in cursor:
- print(row)
复制代码 5.2.2 数据框情势输出
- #---------运行成功
- import pandas as pd
- import cx_Oracle
- from sqlalchemy import create_engine
- # 数据库连接信息
- dsn_tns = cx_Oracle.makedsn('YOUR_HOST', 'YOUR_PORT', service_name='YOUR_SERVICE_NAME')
- conn_string = f"oracle+cx_oracle://{YOUR_USERNAME}:{YOUR_PASSWORD}@{dsn_tns}"
- # 创建数据库引擎
- engine = create_engine(conn_string)
- # 构建SQL查询语句
- query = f"select {number_column}, {clob_column} FROM {table_name} where rownum<=5"
- # 使用pandas的read_sql_query方法执行查询并获取结果
- df = pd.read_sql_query(query, con=engine)
- print(df)
- # 关闭数据库连接
- engine.dispose()
复制代码 或者下面的代码,自定义一个函数的情势,实现多次调用。
- ##----运行成功
- import pandas as pd
- import cx_Oracle as cx
- from sqlalchemy import create_engine
- def visitOracle(sql):
- # 数据库连接信息
- dsn_tns = cx.makedsn(('YOUR_HOST', 'YOUR_PORT', service_name='YOUR_SERVICE_NAME')
- conn = f"oracle+cx_oracle://{YOUR_USERNAME}:{YOUR_PASSWORD}@{dsn_tns}"
- # 创建数据库引擎
- engine = create_engine(conn)
- # 使用pandas的read_sql_query方法执行查询并获取结果
- df = pd.read_sql_query(sql, con=engine)
- # 关闭数据库连接
- engine.dispose()
- return df
- ##诊疗记录
- sql = "select {number_column}, {clob_column} FROM {table_name} where rownum<=5""
- df = visitOracle(sql)
- print(df)
复制代码 以上两种代码都可以执行成功!!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |