python cx_Oracle的基础使用方法(连接和增删改查)


Posted in Python onNovember 19, 2017

问题

使用python操作oracle数据库,获取表的某几个字段作为变量值使用。

使用Popen+sqlplus的方法需要对格式进行控制,通过流获取这几个字段值不简洁(个人观点……)。(优点是能够使用sqlplus的方法直接访问sql文件,不需要考虑打开/关闭连接,并且通过流向文件中写入还挺好用的。不过优点不是这次所关注的)

使用cx-Oracle将查询结果返回为tuple格式,对返回结果的操作简洁,满足需求。(要注意数据库连接创建与关闭、sql的编写、预处理与提交等等,看起来也不简洁(同样个人观点……))

基础方法

数据库连接

1、使用tns串连接

oracle_tns = cx_Oracle.makedsn('XXX.XXX.XXX.XXX', 1521,'oracleName')
connectObj = cx_Oracle.connect('oracleUserName', 'password', oracle_tns)

2、其他简洁方式

db = cx_Oracle.connect('hr', 'hrpwd', 'localhost:1521/XE')
db1 = cx_Oracle.connect('hr/hrpwd@localhost:1521/XE')

数据库断开连接

connectObj.close()

建立游标

cursorObj = connectObj.cursor()

关闭游标

cursorObj.close()

1、单条插入:

sql = "INSERT INTO T_AUTOMONITOR_TMP(point_id) VALUES(:pointId)"
cursorObj.prepare(sql)
rown = cursorObj.execute(None, {'pointId' : pointId})
connectObj.commit()

2、多条插入:

sql = "INSERT INTO T_AUTOMONITOR_TMP(point_id) VALUES(:pointId)"
cursorObj.prepare(sql)
rown = cursorObj.executemany(None, recordList)
connectObj.commit()

sql = "DELETE FROM T_AUTOMONITOR_TMP t WHERE t.point_id = :pointId "
cursorObj.prepare(sql)
rown = cursorObj.execute(None, {'pointId' : pointId})
connectObj.commit()

sql = "UPDATE t_automonitor_other t\
  SET t.active = '2'\
  WHERE t.active = '1'\
  AND t.point_id = :pointId\
  "
cursorObj.prepare(sql)
cursorObj.execute(None, {'pointId' : pointId})
connectObj.commit()

sql = "SELECT t.describ FROM t_automonitor_tmp t WHERE t.point_id = :pointId"
cursorObj.prepare(sql)
cursorObj.execute(None, {'pointId' : pointId})

Tips

  • 增、删、改操作都需要当前连接进行commit()
  • 若使用一个游标cursor进行N次查询,注意若再使用前N-1次查询结果可能会存在异常。要进行多个查询,个人建议使用完cursor后将结果保留再关闭cursor,多次查询重复该操作。
  • 如果不使用prepare,可以直接使用execute,以下查询等价:
r1 = cursor.execute('SELECT * FROM locations WHERE country_id=:1 AND city=:2', ('US', 'Seattle'))
r2 = cursor.execute('SELECT * FROM locations WHERE country_id=:9 AND city=:4', ('US', 'Seattle'))
r3 = cursor.execute('SELECT * FROM locations WHERE country_id=:m AND city=:0', ('US', 'Seattle'))
  • sql语句的语法与数据库有关,不想使用绑定变量,可以拼接sql字符串 (´•༝•`)

简单工具

class baseUtilsX():
 """baseUtils"""
 def __init__(self):
  self.connectObj = ""
  self.connCnt = 0
  self.cursorCnt = 0

 def initOracleConnect(self):
  oracle_tns = cx_Oracle.makedsn('XXX.XXX.XXX.XXX', 1521,'XX')
  if self.connCnt == 0:
   self.connectObj = cx_Oracle.connect('oracleUserName', 'password', oracle_tns)
   self.connCnt += 1

 def getOracleConnect(self):
  self.initOracleConnect()
  return self.connectObj
 
 def closeOracleConnect(self, connectObj):
  connectObj.close()
  self.connCnt -= 1

 def getOracleCursor(self):
  self.initOracleConnect()
  self.cursorCnt += 1
  return self.connectObj.cursor()

 def closeOracleCursor(self, cursorObj):
  cursorObj.close()
  self.cursorCnt -= 1
  if self.cursorCnt == 0:
   print "will close conn"
   self.closeOracleConnect(self.connectObj)

 def selectFromDbTable(self, sql, argsDict):
  # 将查询结果由tuple转为list
  queryAnsList = []
  selectCursor = self.getOracleCursor()
  selectCursor.prepare(sql)
  queryAns = selectCursor.execute(None, argsDict)
  for ansItem in queryAns:
   queryAnsList.append(list(ansItem))

  self.closeOracleCursor(selectCursor)
  return queryAnsList

python 连接 Oracle 乱码问题(cx_Oracle)

用python连接Oracle是总是乱码,最后发现时oracle客户端的字符编码设置不对。

编写的python脚本中需要加入如下几句:

import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'

这样可以保证select出来的中文显示没有问题。

要能够正常的insert和update中文,还需要指定python源文件的字符集密码和oracle一致。

# -*- coding: utf-8 -*-

例子:

# -*- coding: utf-8 -*-

import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8' #或者os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.AL32UTF8'

 

import cx_Oracle
db = cx_Oracle.connect(username/passwd@host:port/sevicename)
cursor = db.cursor()
#其他操作

db.commit()
db.close()

参考:

客户端的NLS_LANG设置及编码转换

      ①在Oracle客户端向服务器端提交SQL语句时,Oracle客户端根据NLS_LANG和数据库字符集,对从应用程序接传送过来的字符串编码进行转换处理。如果NLS_LANG与数据库字符集相同,不作转换,否则要转换成数据库字符集并传送到服务器。服务器在接收到字符串编码之后,对于普通的CHAR或VARCHAR2类型,直接存储;对于NCHAR或NVARCHAR2类型,服务器端将其转换为国家字符集再存储。

      ①在Oracle客户端向服务器端提交SQL语句时,Oracle客户端根据NLS_LANG和数据库字符集,对从应用程序接传送过来的字符串编码进行转换处理。如果NLS_LANG与数据库字符集相同,不作转换,否则要转换成数据库字符集并传送到服务器。服务器在接收到字符串编码之后,对于普通的CHAR或VARCHAR2类型,直接存储;对于NCHAR或NVARCHAR2类型,服务器端将其转换为国家字符集再存储。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

参考文章

精通 Oracle+Python,第 1 部分:查询最佳应践

Python 相关文章推荐
Python读写Excel文件的实例
Nov 01 Python
videocapture库制作python视频高速传输程序
Dec 23 Python
在Django的视图中使用form对象的方法
Jul 18 Python
使用Python编写爬虫的基本模块及框架使用指南
Jan 20 Python
Python实现图片转字符画的示例
Aug 22 Python
解读! Python在人工智能中的作用
Nov 14 Python
Python Opencv任意形状目标检测并绘制框图
Jul 23 Python
Python切图九宫格的实现方法
Oct 10 Python
基于spring boot 日志(logback)报错的解决方式
Feb 20 Python
Django:使用filter的pk进行多值查询操作
Jul 15 Python
基于python实现生成指定大小txt文档
Jul 20 Python
Python抖音快手代码舞(字符舞)的实现方法
Feb 07 Python
Python实现mysql数据库更新表数据接口的功能
Nov 19 #Python
python中urlparse模块介绍与使用示例
Nov 19 #Python
Python Flask-web表单使用详解
Nov 18 #Python
python+selenium实现京东自动登录及秒杀功能
Nov 18 #Python
深入理解Python单元测试unittest的使用示例
Nov 18 #Python
Python及PyCharm下载与安装教程
Nov 18 #Python
Python实现读取json文件到excel表
Nov 18 #Python
You might like
《魔兽争霸3:重制版》更新 多项视觉效果调整
2020/05/04 魔兽争霸
PHP安全配置
2006/10/09 PHP
PHP图片上传类带图片显示
2006/11/25 PHP
php合并数组array_merge函数运算符加号与的区别
2008/10/31 PHP
PHP register_shutdown_function函数的深入解析
2013/06/03 PHP
php的SimpleXML方法读写XML接口文件实例解析
2014/06/16 PHP
WordPress中用于检索模版的相关PHP函数使用解析
2015/12/15 PHP
php中序列化与反序列化详解
2017/02/13 PHP
php语法检查的方法总结
2019/01/21 PHP
PHP封装请求类实例分析【基于Yii框架】
2019/10/17 PHP
javascript引用对象的方法代码
2007/08/13 Javascript
jQuery EasyUI 的EasyLoader功能介绍
2010/09/12 Javascript
jquery animate实现鼠标放上去显示离开隐藏效果
2013/07/21 Javascript
javascript实现简单的Map示例介绍
2013/12/23 Javascript
Jquery跳到页面指定位置的方法
2014/05/12 Javascript
Angularjs 基础入门
2014/12/26 Javascript
js实现字符串转日期格式的方法
2015/05/20 Javascript
简介JavaScript中substring()方法的使用
2015/06/06 Javascript
javascript中Date()函数在各浏览器中的显示效果
2015/06/18 Javascript
jqGrid用法汇总(全经典)
2016/06/28 Javascript
JS 实现Base64编码与解码实例详解
2016/11/07 Javascript
JS中IP地址与整数相互转换的实现代码
2017/04/10 Javascript
js字符串与Unicode编码互相转换
2017/05/17 Javascript
Vue.js组件通信的几种姿势
2017/10/23 Javascript
JS实现的Object数组去重功能示例【数组成员为Object对象】
2019/02/01 Javascript
详解Nuxt内导航栏的两种实现方式
2020/04/16 Javascript
使用Python简单的实现树莓派的WEB控制
2016/02/18 Python
Python Pandas对缺失值的处理方法
2019/09/27 Python
Python和Sublime整合过程图示
2019/12/25 Python
用html5的canvas和JavaScript创建一个绘图程序的简单实例
2016/07/06 HTML / CSS
优秀毕业生自荐信范文
2014/01/01 职场文书
校园歌手大赛策划书
2014/01/17 职场文书
团委副书记工作总结
2015/08/14 职场文书
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
2021/06/08 Python
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
2022/04/14 Python
使用Postman测试需要授权的接口问题
2022/06/21 Java/Android