摘要:使用的方法需要对格式进行控制,通过流获取这几个字段值不简洁个人观点。优点是能够使用的方法直接访问文件,不需要考虑打开关闭连接,并且通过流向文件中写入还挺好用的。要进行多个查询,个人建议使用完后将结果保留再关闭,多次查询重复该操作。
问题
使用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参考文章
精通 Oracle+Python,第 1 部分:查询最佳应践
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/44470.html
摘要:连接当前环境下载安装包由于我本地版本是所以选择是版本参考安装包列表安装安装查看当前引入模块库的路径检查安装路径,如果文件不在以上引入路径内需要将该文件拷贝到以上引入路径所以我这里不需要进行拷贝操作 Python连接Oracle 当前环境:Linux Centos 7 1. 下载安装包cx_Oracle 由于我本地Python版本是2.7,所以选择是2.7版本 wget https:...
http://www.cs.utexas.edu/~mitra/csSpring2011/cs327/cx_mac.html Build and Install cx_Oracle on Mac Leopard Intel I finally succeeded in building and installing cx_Oracle on a Mac. I will outline the ...
阅读 2397·2021-10-09 09:44
阅读 2132·2021-10-08 10:05
阅读 3423·2021-07-26 23:38
阅读 2991·2019-08-28 18:16
阅读 812·2019-08-26 11:55
阅读 1820·2019-08-23 18:29
阅读 2034·2019-08-23 18:05
阅读 1364·2019-08-23 17:02