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之关于类的初步认识
Oct 11 Python
轻松实现python搭建微信公众平台
Feb 16 Python
Python 制作糗事百科爬虫实例
Sep 22 Python
python 把数据 json格式输出的实例代码
Oct 31 Python
详解Python里使用正则表达式的ASCII模式
Nov 02 Python
Python使用分布式锁的代码演示示例
Jul 30 Python
Python3.6使用tesseract-ocr的正确方法
Oct 17 Python
使用Django连接Mysql数据库步骤
Jan 15 Python
Tensorflow实现部分参数梯度更新操作
Jan 23 Python
python中 _、__、__xx__()区别及使用场景
Jun 30 Python
浅谈django框架集成swagger以及自定义参数问题
Jul 07 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
Dec 14 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
php连接oracle数据库及查询数据的方法
2014/12/29 PHP
php数字每三位加逗号的功能函数
2015/10/22 PHP
PHP时间类完整实例(非常实用)
2015/12/25 PHP
PHP对XML内容进行修改和删除实例代码
2016/10/26 PHP
Smarty模板常见的简单应用分析
2016/11/15 PHP
基于laravel belongsTo使用详解
2019/10/18 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
JavaScript获取路径设计源码
2014/05/22 Javascript
使用js画图之画切线
2015/01/12 Javascript
jquery实现表格本地排序的方法
2015/03/11 Javascript
简介JavaScript中的getSeconds()方法的使用
2015/06/10 Javascript
BootStrap3中模态对话框的使用
2017/01/06 Javascript
微信小程序 支付功能实现PHP实例详解
2017/05/12 Javascript
layui导航栏实现代码
2017/05/19 Javascript
jQuery实现上传图片前预览效果功能
2017/08/03 jQuery
Hexo已经看腻了,来手把手教你使用VuePress搭建个人博客
2018/04/26 Javascript
详解JavaScript中typeof与instanceof用法
2018/10/24 Javascript
新手该如何学python怎么学好python?
2008/10/07 Python
python中的多重继承实例讲解
2014/09/28 Python
python+flask实现API的方法
2018/11/21 Python
怎样写演讲稿
2014/01/04 职场文书
给酒店员工的表扬信
2014/01/11 职场文书
六一儿童节活动策划方案
2014/01/27 职场文书
道路交通安全实施方案
2014/03/12 职场文书
绿色学校实施方案
2014/03/31 职场文书
机关搬迁方案
2014/05/18 职场文书
提拔干部考察材料
2014/05/26 职场文书
我的大学四年规划书范文2014
2014/09/26 职场文书
助学感谢信范文
2015/01/21 职场文书
签证工作证明模板
2015/06/15 职场文书
婚礼父母致辞
2015/07/28 职场文书
2016教师年度考核评语大全
2015/12/01 职场文书
同学联谊会邀请函
2019/06/24 职场文书
mysql字符串截取函数小结
2021/04/05 MySQL
python 机器学习的标准化、归一化、正则化、离散化和白化
2021/04/16 Python
Java实现HTML转为Word的示例代码
2022/06/28 Java/Android