使用python操做oracle数据库,获取表的某几个字段做为变量值使用。html
使用Popen
+sqlplus
的方法须要对格式进行控制,经过流获取这几个字段值不简洁(我的观点……)。(优势是可以使用sqlplus
的方法直接访问sql文件,不须要考虑打开/关闭链接,而且经过流向文件中写入还挺好用的。不过优势不是此次所关注的)python
使用cx-Oracle
将查询结果返回为tuple
格式,对返回结果的操做简洁,知足需求。(要注意数据库链接建立与关闭、sql的编写、预处理与提交等等,看起来也不简洁(一样我的观点……))sql
一、使用tns
串链接数据库
oracle_tns = cx_Oracle.makedsn('XXX.XXX.XXX.XXX', 1521,'oracleName') connectObj = cx_Oracle.connect('oracleUserName', 'password', oracle_tns)
二、其余简洁方式oracle
db = cx_Oracle.connect('hr', 'hrpwd', 'localhost:1521/XE')
db1 = cx_Oracle.connect('hr/hrpwd@localhost:1521/XE')app
connectObj.close()
cursorObj = connectObj.cursor()
cursorObj.close()
一、单条插入:工具
sql = "INSERT INTO T_AUTOMONITOR_TMP(point_id) VALUES(:pointId)" cursorObj.prepare(sql) rown = cursorObj.execute(None, {'pointId' : pointId}) connectObj.commit()
二、多条插入:code
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})
增、删、改操做都须要当前链接进行commit()
htm
若使用一个游标cursor
进行N次查询,注意若再使用前N-1次查询结果可能会存在异常。要进行多个查询,我的建议使用完cursor
后将结果保留再关闭cursor
,屡次查询重复该操做。ip
若是不使用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