使用pycharm连接读取orcl数据库的表

背景:工作需要
需求:使用pycharm访问远程oracle类型数据库的表,表中包含lob字段(这也是个坑!)

麻了,搞了一个星期,终于成功了,真可谓是每步都有坑,看的文章也有小一百篇了,我要及时把自己的踩坑路总结出来,希望对你有用哟~

一、在Pycharm中下载cx_Oracle包

如果加载不成功,使用Anaconda Prompt在自己的环境中下载

我是在Pycharm终端执行如下代码

python 复制代码
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple cx_Oracle

然后开开心心运行,本以为到这里就成功结束了

python 复制代码
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试试

四、查询表并输出数据框形式

bash 复制代码
#运行成功
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 安装指定版本也失败了
  • 使用镜像源安装成功!!
bash 复制代码
#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 查询数据库并访问表

bash 复制代码
#---------运行成功
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()

或者下面的代码,自定义一个函数的形式,实现多次调用。

bash 复制代码
##----运行成功
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)

以上两种代码都可以执行成功!!

相关推荐
龙言龙论21 小时前
身份证信息批量处理系统:从入门到实战(附exe工具+核心源码)
数据库·python
m0_626535201 天前
代码分析 长音频分割为短音频
javascript·python·音视频
Wpa.wk1 天前
自动化测试环境配置-java+python
java·开发语言·python·测试工具·自动化
带刺的坐椅1 天前
AI 应用工作流:LangGraph 和 Solon AI Flow,我该选谁?
java·python·ai·solon·flow·langgraph
2***d8851 天前
使用 MySQL 从 JSON 字符串提取数据
mysql·oracle·json
工业互联网专业1 天前
图片推荐系统_django+spider
python·django·毕业设计·源码·课程设计·spider·图片推荐系统
Lwcah1 天前
Python | LGBM+SHAP可解释性分析回归预测及可视化算法
python·算法·回归
@一辈子爱你1 天前
归来九十余日:在时代的夹缝中,与你共筑一道光
python
I***26151 天前
智能生成ER图工具。使用 SQL 生成 ER 图:让数据库设计更高效
数据库·sql·oracle
HsuHeinrich1 天前
利用面积图探索历史温度的变化趋势
python·数据可视化