iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python调用SQLPlus来操作和解析Oracle数据库的方法
  • 588
分享到

Python调用SQLPlus来操作和解析Oracle数据库的方法

操作数据库方法 2022-06-04 19:06:41 588人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

先来看一个简单的利用python调用sqlplus来输出结果的例子: import os import sys from subprocess import Popen, PIPE sql = ""

先来看一个简单的利用python调用sqlplus来输出结果的例子:


import os
import sys
from subprocess import Popen, PIPE
 
sql = """
set linesize 400
col owner for a10
col object_name for a30
 
select owner, object_name
 from dba_objects
 where rownum<=10;
"""
 
proc = Popen(["sqlplus", "-S", "/", "as", "sysdba"], stdout=PIPE, stdin=PIPE, stderr=PIPE)
proc.stdin.write(sql)
(out, err) = proc.communicate()
 
if proc.returncode != 0:
  print err
  sys.exit(proc.returncode)
else:
  print out


Python查询oracle,当然最好用cx_Oracle库,但有时候受到种种限制,不能安装Python第三方库,就得利用现有资源,硬着头皮上了。

用Python调用SqlPlus查询Oracle,首先要知道SqlPlus返回结果是什么样的:


(这是空行)
Number    Name    Address
------------ ----------- ------------------
1001     张三     南京路
1002     李四     上海路

第1行是空行,第2行是字段名称,第3行都是横杠,有空格隔开,第4行开始是查询到的结果。

在查询结果规整的情况下,根据第3行可以很清晰的看到结构,用Python解析起来也比较方便。但是,如果一张表字段特别多,记录数也相当多,那么默认情况下调用SqlPlus查询出的结果会比较乱,这就需要在调用查询之前做一些设定,比如:


set linesize 32767
set pagesize 9999
set term off verify off feedback off tab off
set numwidth 40

这样的调用查询结果就比较规整了。接下来就是用强大的Python来解析查询结果。

这里封装了一个函数,可以根据传入的SQL语句查询并解析结果,将每行结果存到列表中,列表中的每个元素是一个字段名称与值的映射。


#!/usr/bin/python
#coding=UTF-8

'''
@author: 双子座@开源中国
@summary: 通过SqlPlus查询Oracles数据库
'''

import os;

os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.AL32UTF8'
gStrConnection = 'username/passWord@10.123.5.123:1521/ora11g'

#解析SqlPlus的查询结果,返回列表
def parseQueryResult(listQueryResult):
  listResult = []
  #如果少于4行,说明查询结果为空
  if len(listQueryResult) < 4:
    return listResult
  #第0行是空行,第1行可以获取字段名称,第2行可获取SQLPlus原始结果中每列宽度,第3行开始是真正输出
  # 1 解析第2行,取得每列宽度,放在列表中
  listStrTmp = listQueryResult[2].split(' ')
  listIntWidth = []
  for oneStr in listStrTmp:
    listIntWidth.append(len(oneStr))
  # 2 解析第1行,取得字段名称放在列表中
  listStrFieldName = []
  iLastIndex = 0
  lineFieldNames = listQueryResult[1]
  for iWidth in listIntWidth:
    #截取[iLastIndex, iLastIndex+iWidth)之间的字符串
    strFieldName = lineFieldNames[iLastIndex:iLastIndex + iWidth]
    strFieldName = strFieldName.strip() #去除两端空白符
    listStrFieldName.append(strFieldName)
    iLastIndex = iLastIndex + iWidth + 1
  # 3 第3行开始,解析结果,并建立映射,存储到列表中
  for i in range(3, len(listQueryResult)):
    oneLiseResult = unicode(listQueryResult[i], 'UTF-8')
    fieldMap = {}
    iLastIndex = 0
    for j in range(len(listIntWidth)):
      strFieldValue = oneLiseResult[iLastIndex:iLastIndex + listIntWidth[j]]
      strFieldValue = strFieldValue.strip()
      fieldMap[listStrFieldName[j]] = strFieldValue
      iLastIndex = iLastIndex + listIntWidth[j] + 1
    listResult.append(fieldMap)
  return listResult

def QueryBySqlPlus(sqlCommand):
  global gStrConnection
  #构造查询命令
  strCommand = 'sqlplus -S %s <<!n' % gStrConnection
  strCommand = strCommand + 'set linesize 32767n'
  strCommand = strCommand + 'set pagesize 9999n'
  strCommand = strCommand + 'set term off verify off feedback off tab off n'
  strCommand = strCommand + 'set numwidth 40n'
  strCommand = strCommand + sqlCommand + 'n'
  #调用系统命令收集结果
  result = os.popen(strCommand)
  list = []
  for line in result:
    list.append(line)
  return parseQueryResult(list)

其中os.environ['NLS_LANG']的值来自


select userenv['language'] from dual;

在调用的时候,只要类似:

listResult = QueryBySqlPlus('select * from studentinfo')

然后就可以用循环打印出结果了。

--结束END--

本文标题: Python调用SQLPlus来操作和解析Oracle数据库的方法

本文链接: https://www.lsjlt.com/news/15086.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python调用SQLPlus来操作和解析Oracle数据库的方法
    先来看一个简单的利用python调用sqlplus来输出结果的例子: import os import sys from subprocess import Popen, PIPE sql = ""...
    99+
    2022-06-04
    操作 数据库 方法
  • 如何调用PHP方法来操作数据库
    如果你想学习PHP,那么使用数据库是绕不过去的一道坎。因为与数据打交道是任何网站开发中不可或缺的一步。在这篇文章中,我们将会学习如何调用PHP方法来操作数据库。PHP连接数据库在使用数据库之前,我们首先需要保证已经正确地连接了数据库。在PH...
    99+
    2023-05-14
    php 数据库
  • 怎么调用PHP方法来操作数据库
    本篇内容主要讲解“怎么调用PHP方法来操作数据库”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么调用PHP方法来操作数据库”吧!PHP连接数据库在使用数据库之前,我们首先需要保证已经正确地连接...
    99+
    2023-07-05
  • Python使用JSON库解析JSON数据的方法
    目录1 如何在网页中获取 JSON 数据?2 Python 内置的 JSON 库1 如何在网页中获取 JSON 数据? 打开一个具有动态渲染的网页,按 F12 打开浏览器开发工具,点...
    99+
    2022-11-11
  • 在Linux系统中使用Python脚本操作MySQL数据库的方法
    在Linux系统中使用Python脚本操作MySQL数据库的方法随着数据处理和存储的需求不断增加,MySQL数据库成为了开发者们常用的选择之一。在Linux系统中,使用Python脚本与MySQL数据库进行交互十分便捷,本文将介绍如何在Li...
    99+
    2023-10-22
    Python Linux MySQL
  • Linux操作系统下oracle数据库中不存在scott用户的解决方案
    ① 以'sys'用户登录到数据库中,输入select * from dba_users;查看一下是否存在scott用户,如下图所示:如上图所示,scott用户的确不存在。② 由于操作系统是Linu...
    99+
    2022-10-18
  • .Net Core 使用NLog记录日志到文件和数据库的操作方法
    NLog 记录日志是微软官方推荐使用。 接下来,通过配置日志记录到文件和Sql Server数据库。 第一步:首先添加包NLog.Config (可通过微软添加包命令Install-...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作