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装饰器decorator用法实例
Nov 10 Python
python根据开头和结尾字符串获取中间字符串的方法
Mar 26 Python
Python实现从URL地址提取文件名的方法
May 15 Python
在Linux系统上安装Python的Scrapy框架的教程
Jun 11 Python
使用tensorflow实现AlexNet
Nov 20 Python
Python温度转换实例分析
Jan 17 Python
PyQt5实现从主窗口打开子窗口的方法
Jun 19 Python
PyQt QListWidget修改列表项item的行高方法
Jun 20 Python
树莓派动作捕捉抓拍存储图像脚本
Jun 22 Python
Django-Model数据库操作(增删改查、连表结构)详解
Jul 17 Python
浅谈Pytorch中的torch.gather函数的含义
Aug 18 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
Apr 14 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 Hash函数,增强密码安全
2011/02/25 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
2013/06/28 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
javascript制作的网页侧边弹出框思路及实现代码
2014/05/21 Javascript
简介可以自动完成UI的AngularJS工具angular-smarty
2015/06/23 Javascript
学习JavaScript设计模式(代理模式)
2015/12/03 Javascript
详解JavaScript中数组和字符串的lastIndexOf()方法使用
2016/03/13 Javascript
AngularJS表格详解及示例代码
2016/08/17 Javascript
微信小程序 缓存(本地缓存、异步缓存、同步缓存)详解
2017/01/17 Javascript
解决layer.confirm快速点击会重复触发事件的问题
2019/09/23 Javascript
Layer组件多个iframe弹出层打开与关闭及参数传递的方法
2019/09/25 Javascript
微信小程序点击顶部导航栏切换样式代码实例
2019/11/12 Javascript
vue中element 的upload组件发送请求给后端操作
2020/09/07 Javascript
vue 通过base64实现图片下载功能
2020/12/19 Vue.js
Python语言实现机器学习的K-近邻算法
2015/06/11 Python
Python文件处理
2016/02/29 Python
Python 列表(List) 的三种遍历方法实例 详解
2017/04/15 Python
关于python列表增加元素的三种操作方法
2018/08/22 Python
Python函数any()和all()的用法及区别介绍
2018/09/14 Python
python判断字符串或者集合是否为空的实例
2019/01/23 Python
Python2与Python3的区别实例分析
2019/04/11 Python
Pytorch to(device)用法
2020/01/08 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
2020/05/25 Python
基于Python下载网络图片方法汇总代码实例
2020/06/24 Python
基于CSS3的animation属性实现微信拍一拍动画效果
2020/06/22 HTML / CSS
使用HTML5做个画图板的方法介绍
2013/05/03 HTML / CSS
彪马荷兰官网:PUMA荷兰
2019/05/08 全球购物
下面这个程序执行后会有什么错误或者效果
2014/11/03 面试题
网络编辑岗位职责
2014/03/18 职场文书
什么是就业协议书
2014/04/17 职场文书
召开会议通知范文
2015/04/15 职场文书
网络妈妈观后感
2015/06/08 职场文书
2019年市场部个人述职报告(三篇)
2019/10/23 职场文书
一文搞懂Golang 时间和日期相关函数
2021/12/06 Golang
2021年国产动漫公司排行前十名,玄机科技上榜,第二推出过铠甲勇士
2022/03/18 杂记
win10重装系统后上不了网怎么办 win10重装系统网络故障的解决办法
2022/07/23 数码科技