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中使用判断语句和循环的教程
Apr 25 Python
Python实现针对中文排序的方法
May 09 Python
python实现word 2007文档转换为pdf文件
Mar 15 Python
Python使用cx_Freeze库生成msi格式安装文件的方法
Jul 10 Python
解决django后台样式丢失,css资源加载失败的问题
Jun 11 Python
python selenium 查找隐藏元素 自动播放视频功能
Jul 24 Python
python爬虫 2019中国好声音评论爬取过程解析
Aug 26 Python
python实现多线程端口扫描
Aug 31 Python
pytorch+lstm实现的pos示例
Jan 14 Python
Python发送邮件封装实现过程详解
May 09 Python
解决virtualenv -p python3 venv报错的问题
Feb 05 Python
python3 hdf5文件 遍历代码
May 19 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
PHP 时间转换Unix时间戳代码
2010/01/22 PHP
Yii2.0 模态弹出框+ajax提交表单
2016/05/22 PHP
php使用preg_match()函数验证ip地址的方法
2017/01/07 PHP
php静态成员方法和静态的成员属性的使用方法
2017/10/26 PHP
php装饰者模式简单应用案例分析
2019/10/23 PHP
Ext4.2的Ext.grid.plugin.RowExpander无法触发事件解决办法
2014/08/15 Javascript
jquery实现textarea 高度自适应
2015/03/11 Javascript
jquery 表单验证之通过 class验证表单不为空
2015/11/02 Javascript
为何JS操作的href都是javascript:void(0);呢
2015/11/12 Javascript
JavaScript电子时钟倒计时
2016/01/09 Javascript
Bootstrap 组件之按钮(二)
2016/05/11 Javascript
vue项目上传Github预览的实现示例
2018/11/06 Javascript
用jQuery将JavaScript对象转换为querystring查询字符串的方法
2018/11/12 jQuery
ES6基础之解构赋值(destructuring assignment)
2019/02/21 Javascript
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
2021/03/01 Vue.js
[44:21]Ti4 循环赛第四日 附加赛NEWBEE vs LGD
2014/07/13 DOTA
python实现在控制台输入密码不显示的方法
2015/07/02 Python
python查看FTP是否能连接成功的方法
2015/07/30 Python
Python 的描述符 descriptor详解
2016/02/27 Python
在windows系统中实现python3安装lxml
2016/03/23 Python
Python 中 Virtualenv 和 pip 的简单用法详解
2017/08/18 Python
Python 多线程的实例详解
2017/09/07 Python
python实现机械分词之逆向最大匹配算法代码示例
2017/12/13 Python
tensorflow实现对图片的读取的示例代码
2018/02/12 Python
Python 虚拟空间的使用代码详解
2019/06/10 Python
为什么是 Python -m
2020/06/19 Python
Jupyter Notebook 远程访问配置详解
2021/01/11 Python
html5-websocket基于远程方法调用的数据交互实现
2012/12/04 HTML / CSS
HTML5无刷新改变当前url的代码
2017/03/15 HTML / CSS
荷兰的时尚市场:To Be Dressed
2019/05/06 全球购物
精美的手工家居和生活用品:Nkuku
2019/11/01 全球购物
小学“向国旗敬礼”网上签名寄语活动总结
2014/09/27 职场文书
秦始皇兵马俑导游词
2015/02/02 职场文书
保险公司客户经理岗位职责
2015/04/09 职场文书
mysql5.7的安装及Navicate长久免费使用的实现过程
2021/11/17 MySQL
python 使用tkinter与messagebox写界面和弹窗
2022/03/20 Python