博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python cx_Oracle基础使用方法
阅读量:5935 次
发布时间:2019-06-19

本文共 3292 字,大约阅读时间需要 10 分钟。

问题

使用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

参考文章

转载地址:http://gsjtx.baihongyu.com/

你可能感兴趣的文章
linux安全---cacti+ntop监控
查看>>
鸟哥的linux私房菜-shell简单学习-1
查看>>
nagios配置监控的一些思路和工作流程
查看>>
通讯组基本管理任务三
查看>>
赫夫曼编码实现
查看>>
html页面显示div源代码
查看>>
基础复习-算法设计基础 | 复杂度计算
查看>>
debian、ubuntu系统下,常用的下载工具
查看>>
带以太网的MicroPython开发板:TPYBoardv201温湿度上传实例
查看>>
如何解压缩后缀名为zip.001,zip.002等的文件
查看>>
OSGI企业应用开发(十二)OSGI Web应用开发(一)
查看>>
Python 以指定概率获取元素
查看>>
微信公众平台图文教程(二) 群发功能和素材管理
查看>>
关于System.Collections空间
查看>>
MPP(大规模并行处理)
查看>>
Centos下基于Hadoop安装Spark(分布式)
查看>>
POJ2348 UVa10368 HDU1525 Euclid's Game【博弈】
查看>>
Java 位运算
查看>>
好用的CSS模块化打包工具CSS-COMBO
查看>>
python 中的字符和字符串
查看>>