python oracle几种方法_python cx_Oracle基础使用方法

问题

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

参考文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值