Python操作Oracle数据库的简单方法和封装类实例


Posted in Python onMay 07, 2018

本文实例讲述了Python操作Oracle数据库的简单方法和封装类。分享给大家供大家参考,具体如下:

最近工作有接触到Oracle,发现很多地方用Python脚本去做的话,应该会方便很多,所以就想先学习下Python操作Oracle的基本方法。

考虑到Oracle的使用还有一个OracleClient的NetConfig的存在,我觉得连接起来就应该不是个简单的事情。

果然,网上找了几个连接方法,然后依葫芦却画了半天,却也不得一个瓢。

方法1:用户名,密码和监听分别作为参数

conn=cx_Oracle.connect('用户名','密码','数据库地址:数据库端口/SID')

根据我看的几篇文章和我写代码出错的提示,我找到了python连接数据库的配置项应该和Oracle客户端的配置文件tnsnames.ora有关。但是我的配置项并没有SID项,而且一开始我也不知SID是个什么东西,网上写什么我就跟着写,所以这种方法失败了。后来想通了要在配置项加一个SID,然后想想这个东西配置完了我系统是不是要重启啊。所以,先看看其他方法吧….

方法2:用户名,密码和监听共同作为一个参数

conn=cx_Oracle.connect('用户名/密码@数据库地址:数据库端口/SID')

这个方法基本和方法一一样,换汤不换药…

方法3:使用tns配置信息

conn=cx_Oracle.connect('用户名','密码',tns)

网上的代码获取tns是用函数做的,依然会使用SID,但是..我已经可以用的配置项并没有SID啊,所以使用

tns=cx_Oracle.makedsn('数据库地址','数据库端口', 'SID')

依旧不行,但是看看这个tns的生成方法和上面的两种方法差不多的。但是我发现我随便输入一个SID后生成的数据是这样的。

(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)))(CONNECT_DATA=(SID=XE)))

然而,我的客户端的配置项大概是这样的,

(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=KGDB)))

我擦,好像长得一样的,类型也都是字符串类型的,试试直接把我文件里的配置项赋值给tns试试。

tns = '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=KGDB)))'
conn = cx_Oracle.connect('nicker', '123456', tns)

嗯。成功了~

最后,贴一个基本使用方法全代码

#coding:utf-8
import cx_Oracle
# 创建数据库连接
# cx_Oracle.connect('username','pwd','ora的tns信息')
# oracle数据库的tns信息,从tnsnames.ora中找到plsql可用的配置项,将该配置项直接拷贝过来即可
ora_tns = '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=KGDB)))'
conn = cx_Oracle.connect('nicker', '123456', ora_tns)
# 操作游标
cursor = conn.cursor()
# 执行查询
cursor.execute("SELECT * FROM inst_info")
# 获取返回信息
rs = cursor.fetchall()
# 输出信息
for v in rs:
  print v
#关闭连接,释放资源
cursor.close()
conn.close()

观察发现总结很重要,理解也需要

贴上一个自己封装Oracle的类

#coding:utf-8
import cx_Oracle
# 封装的类
class cxOracle:
  '''
  tns的取值tnsnames.ora对应的配置项的值,如:
  tns = '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.16.18.23)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=MYDB)))'
  '''
  def __init__(self ,uname, upwd,tns ):
    self ._uname = uname
    self ._upwd = upwd
    self ._tns = tns
    self ._conn = None
    self ._ReConnect()
  def _ReConnect(self ):
    if not self._conn :
      self ._conn = cx_Oracle.connect (self. _uname, self ._upwd, self._tns)
    else:
      pass
  def __del__(self ):
    if self. _conn:
      self ._conn. close()
      self ._conn = None
  def _NewCursor(self ):
    cur = self. _conn.cursor ()
    if cur:
      return cur
    else:
      print "#Error# Get New Cursor Failed."
      return None
  def _DelCursor(self , cur):
    if cur:
      cur .close()
  # 检查是否允许执行的sql语句
  def _PermitedUpdateSql(self ,sql):
    rt = True
    lrsql = sql. lower()
    sql_elems = [ lrsql.strip ().split()]
    # update和delete最少有四个单词项
    if len( sql_elems) < 4 :
      rt = False
    # 更新删除语句,判断首单词,不带where语句的sql不予执行
    elif sql_elems[0] in [ 'update', 'delete']:
      if 'where' not in sql_elems :
        rt = False
    return rt
  # 导出结果为文件
  def Export(self , sql, file_name, colfg ='||'):
    rt = self. Query(sql )
    if rt:
      with open( file_name, 'a') as fd:
        for row in rt:
          ln_info = ''
          for col in row:
             ln_info += str( col) + colfg
          ln_info += '\n'
          fd .write( ln_info)
  # 查询
  def Query(self , sql, nStart=0 , nNum=- 1):
    rt = []
    # 获取cursor
    cur = self. _NewCursor()
    if not cur:
      return rt
    # 查询到列表
    cur .execute(sql)
    if ( nStart==0 ) and (nNum==1 ):
      rt .append( cur.fetchone ())
    else:
      rs = cur. fetchall()
      if nNum==- 1:
        rt .extend( rs[nStart:])
      else:
        rt .extend( rs[nStart:nStart +nNum])
    # 释放cursor
    self ._DelCursor(cur)
    return rt
  # 更新
  def Exec(self ,sql):
    # 获取cursor
    rt = None
    cur = self. _NewCursor()
    if not cur:
      return rt
    # 判断sql是否允许其执行
    if not _PermitedUpdateSql(sql ):
      return rt
    # 执行语句
    rt = cur. execute(sql )
    # 释放cursor
    self ._DelCursor(cur)
    return rt
# 类使用示例
tns = '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.16.17.46)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=MYDB)))'
ora = cxOracle ('nicker', '123456', tns)
# 导出结果为文件
rs = ora .Export("SELECT * FROM org", '1.txt')
# 查询结果到列表
rs = ora.Query("SELECT * FROM org")
print rs
# 更新数据
ora.Exec("update org set org_name='NewNameForUpdate' where org_id=123456;")

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
Feb 18 Python
python实现装饰器、描述符
Feb 28 Python
python实现学生信息管理系统
Apr 05 Python
python高阶爬虫实战分析
Jul 29 Python
Python3中的bytes和str类型详解
May 02 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
Sep 06 Python
Python 实现文件读写、坐标寻址、查找替换功能
Sep 11 Python
Python序列对象与String类型内置方法详解
Oct 22 Python
python 实现单通道转3通道
Dec 03 Python
python-numpy-指数分布实例详解
Dec 07 Python
解决pycharm中导入自己写的.py函数出错问题
Feb 12 Python
python3中编码获取网页的实例方法
Nov 16 Python
Pandas实现数据类型转换的一些小技巧汇总
May 07 #Python
Python使用cx_Oracle模块操作Oracle数据库详解
May 07 #Python
Python代码缩进和测试模块示例详解
May 07 #Python
Python采集代理ip并判断是否可用和定时更新的方法
May 07 #Python
利用python的socket发送http(s)请求方法示例
May 07 #Python
Python爬虫抓取代理IP并检验可用性的实例
May 07 #Python
Python视频爬虫实现下载头条视频功能示例
May 07 #Python
You might like
一个简单的域名注册情况查询程序
2006/10/09 PHP
浅谈PHP值mysql操作类
2016/06/29 PHP
PHP结合Ffmpeg快速搭建流媒体服务的实践记录
2018/10/31 PHP
十分钟打造AutoComplete自动完成效果代码
2009/12/26 Javascript
web页面数据展示新想法(json)
2010/06/08 Javascript
ExtJs GridPanel简单的增删改实现代码
2010/08/26 Javascript
在jQuery 1.5中使用deferred对象的代码(翻译)
2011/03/10 Javascript
左侧是表头的JS表格控件(自写,网上没有的)
2013/06/04 Javascript
js判断游览器类型及版本号的代码
2014/05/11 Javascript
AngularJS基础 ng-include 指令简单示例
2016/08/01 Javascript
React Native之TextInput组件解析示例
2017/08/22 Javascript
vue.js vue-router如何实现无效路由(404)的友好提示
2017/12/20 Javascript
vue elementui form表单验证的实现
2018/11/11 Javascript
js中对象与对象创建方法的各种方法
2019/02/27 Javascript
vue滑动吸顶及锚点定位的示例代码
2020/05/10 Javascript
原生js实现俄罗斯方块
2020/10/20 Javascript
[02:09:59]火猫TV国士无双dota2 6.82版本详解(下)
2014/09/29 DOTA
[01:08:17]2018DOTA2亚洲邀请赛3月29日 小组赛B组 EG VS VGJ.T
2018/03/30 DOTA
python使用wxpython开发简单记事本的方法
2015/05/20 Python
Python中内建函数的简单用法说明
2016/05/05 Python
socket + select 完成伪并发操作的实例
2017/08/15 Python
python opencv实现图片旋转矩形分割
2018/07/26 Python
使用python PIL库实现简单验证码的去噪方法步骤
2019/05/10 Python
Django框架HttpRequest对象用法实例分析
2019/11/01 Python
Python列表切片常用操作实例解析
2019/12/16 Python
深入浅析pycharm中 Make available to all projects的含义
2020/09/15 Python
购买限量版收藏品、珠宝和礼品:Bradford Exchange
2016/09/23 全球购物
法拉利英国精品店:Ferraris Boutique UK
2019/07/20 全球购物
生产部经理岗位职责
2013/12/16 职场文书
淘宝店策划方案
2014/06/07 职场文书
横幅标语大全
2014/06/17 职场文书
意外死亡赔偿协议书
2014/10/14 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
付款承诺函范文
2015/01/21 职场文书
慰问信的写作格式及范文!
2019/06/24 职场文书
HR必备:超全面的薪酬待遇管理方案!
2019/07/12 职场文书