ToB企服应用市场:ToB评测及商务社交产业平台

标题: 利用pycharm毗连读取orcl数据库的表 [打印本页]

作者: 小小小幸运    时间: 2024-6-21 13:40
标题: 利用pycharm毗连读取orcl数据库的表
配景:工作需要
需求:利用pycharm访问长途oracle类型数据库的表,表中包含lob字段(这也是个坑!)

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

  
一、在Pycharm中下载cx_Oracle包

下载安装免费的Pycharm社区版拜见pycharm Mac/windows(2022-2)之下载安装和设置中文
如果加载不成功,利用Anaconda Prompt在自己的环境中下载
我是在Pycharm终端执行如下代码
  1. pip install -i https://pypi.tuna.tsinghua.edu.cn/simple cx_Oracle
复制代码
然后开开心心运行,本以为到这里就成功结束了
  1. import cx_Oracle as oracle
  2. #
  3. def main():
  4.     # cx_Oracle.connect("用户名 /  密码@ Oracle服务器IP  /  Oracle的SERVICE_NAME")
  5.     db = oracle.connect('XXX/XXX@IP地址:端口/sid_name')#换成自己远程要连的库
  6.     c = db.cursor()  # 获取cursor
  7.     x = c.execute("select * from XXX WHERE XXX")  # 使用cursor进行各种查询操作
  8.     rows = c.fetchall()
  9.     for row in rows:
  10.         for v in row:
  11.             print(v)
  12.     c.close()  # 关闭cursor
  13.     db.close()  # 关闭连接
  14. if __name__ == '__main__':
  15.     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试试
四、查询表并输出数据框情势

  1. #运行成功
  2. import cx_Oracle as cx
  3. import pandas as pd
  4. def visitOracle(sql):
  5.     # cx_Oracle.connect("用户名 /  密码@ Oracle服务器IP  /  Oracle的SERVICE_NAME")
  6.     conn = cx.connect('XXX/XXX@IP地址:端口/sid_name')#换成自己远程要连的库
  7.     cursor = conn.cursor()
  8.     cursor.execute(sql)  # 使用cursor进行各种操作
  9.     # 读取字段名
  10.     index = cursor.description
  11.     row = list()
  12.     for i in range(len(index)):
  13.         row.append(index[i][0])
  14.     # 获取返回信息
  15.     data = cursor.fetchall()
  16.     result = pd.DataFrame(list(data), columns=row)
  17.     # 关闭链接,释放资源
  18.     cursor.close()
  19.     conn.close()
  20.     return result
  21. sql = "select * from XXX WHERE XXX'"
  22. df = visitOracle(sql)
  23. print(df)
复制代码
如果是普通的表,是运行成功的,鉴于我的表有一个字段是长文本CLOB类型,所以它报错了
cx_Oracle.DatabaseError: DPI-1040: LOB was already closed
步骤五是我尝试成功的解决办法
五、查询含有lob类型字段的表

5.1 在Pycharm中下载sqlalchemy包


  1. #pip3 install flask-sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple
  2. 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)]
  1. import cx_Oracle
  2. # 连接到Oracle数据库
  3. dsn = cx_Oracle.makedsn('YOUR_HOST', 'YOUR_PORT', service_name='YOUR_SERVICE_NAME')
  4. conn = cx_Oracle.connect(user='YOUR_USERNAME', password='YOUR_PASSWORD', dsn=dsn)
  5. # 查询SQL
  6. query = "select {number_column}, {clob_column} FROM {table_name} where rownum<=5"
  7. # 执行查询
  8. cursor = conn.cursor()
  9. cursor.execute(query)
  10. # 获取所有行
  11. rows = cursor.fetchall()
  12. print(rows)
  13. #获取所有行也可以换成如下,输出结果是一样的
  14. for row in cursor:
  15.     print(row)
复制代码
5.2.2 数据框情势输出

  1. #---------运行成功
  2. import pandas as pd
  3. import cx_Oracle
  4. from sqlalchemy import create_engine
  5. # 数据库连接信息
  6. dsn_tns = cx_Oracle.makedsn('YOUR_HOST', 'YOUR_PORT', service_name='YOUR_SERVICE_NAME')
  7. conn_string = f"oracle+cx_oracle://{YOUR_USERNAME}:{YOUR_PASSWORD}@{dsn_tns}"
  8. # 创建数据库引擎
  9. engine = create_engine(conn_string)
  10. # 构建SQL查询语句
  11. query = f"select {number_column}, {clob_column} FROM {table_name} where rownum<=5"
  12. # 使用pandas的read_sql_query方法执行查询并获取结果
  13. df = pd.read_sql_query(query, con=engine)
  14. print(df)
  15. # 关闭数据库连接
  16. engine.dispose()
复制代码
或者下面的代码,自定义一个函数的情势,实现多次调用。
  1. ##----运行成功
  2. import pandas as pd
  3. import cx_Oracle as cx
  4. from sqlalchemy import create_engine
  5. def visitOracle(sql):
  6.     # 数据库连接信息
  7.     dsn_tns = cx.makedsn(('YOUR_HOST', 'YOUR_PORT', service_name='YOUR_SERVICE_NAME')
  8.     conn = f"oracle+cx_oracle://{YOUR_USERNAME}:{YOUR_PASSWORD}@{dsn_tns}"
  9.     # 创建数据库引擎
  10.     engine = create_engine(conn)
  11.     # 使用pandas的read_sql_query方法执行查询并获取结果
  12.     df = pd.read_sql_query(sql, con=engine)
  13.     # 关闭数据库连接
  14.     engine.dispose()
  15.     return df
  16. ##诊疗记录
  17. sql = "select {number_column}, {clob_column} FROM {table_name} where rownum<=5""
  18. df = visitOracle(sql)
  19. print(df)
复制代码
以上两种代码都可以执行成功!!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4