Python连接Oracle数据库及增删改查实战指南

纸上星河
纸上星河
发布时间:2026-10-13 | 2人浏览过
原创

本文详细记录Python 3.6连接Oracle 11g的环境配置过程,涵盖驱动安装、DLL文件部署及连接测试。通过具体代码示例演示数据库的连接、查询、插入操作,并包含一个爬取彩票数据并入库的递归案例,帮助初学者快速上手Python与Oracle的交互开发。

初次尝试使用Python连接Oracle数据库,特此记录遇到的常见问题与解决步骤,旨在帮助同样初次尝试的朋友快速完成环境配置,顺利进入开发阶段。

第一步,确保Python环境已正确配置以支持Oracle数据库连接。

以下是本文涉及的具体运行环境:

1)Python版本:Python 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 17:26:49) [MSC v.1900 32 bit (Intel)] on win32

2)Oracle版本:11.2.0.1.0 64bit。此处指的是服务器版本号。在连接Oracle数据库时,还需要安装Oracle客户端。客户端版本的下载需参考Python的版本,若Python为32位,则客户端也必须下载32位版本。

3)cx_Oracle:这是Python连接Oracle所需的驱动包,需自行安装。可访问https://pypi.python.org/pypi/cx_Oracle/5.3下载对应驱动。下载时务必选择与Python版本匹配的驱动,例如我的Python是3.6的32位版本,因此选择了cx_Oracle-5.3-11g.win32-py3.6.exe (md5)。下载后直接运行安装程序,安装过程包含自检环节,若未通过则说明驱动版本选择不当。

完成上述准备工作后,在刚才下载的Oracle客户端版本目录中找到以下三个文件:oci.dll、oraocci11.dll、oraociei11.dll,并将这些DLL文件复制到

Python\Python36-32\Lib\site-packages文件夹中。

在Python环境中输入以下代码进行验证:

import cx_Oracle 

若执行后未报错,则表明驱动安装成功。

接下来进行数据库连接操作:

conn = cx_Oracle.connect('xzt/xzt@localhost/testdb')#这里的顺序是用户名/密码@oracleserver的ip地址/数据库名字 
  cur = conn.cursor() 
  sql = "SELECT * FROM DUAL" 
  cur.execute(sql) 
  cur.close() 
  conn.commit() 
  conn.close() 

随后演示数据库查询功能:

import cx_Oracle 
 
conn = cx_Oracle.connect('xzt/xzt@localhost/testdb')  
cursor = conn.cursor () 
 
cursor.execute ("SELECT * FROM STUDENT_TB") 
rows = cursor.fetchall() #得到所有数据集 
for row in rows: 
  print("%d, %s, %s, %s" % (row[0], row[1], row[2], row[3]))#python3以上版本中print()要加括号用了
 
print("Number of rows returned: %d" % cursor.rowcount) 
 
cursor.execute ("SELECT * FROM STUDENT_TB") 
while (True): 
  row = cursor.fetchone() #逐行得到数据集
  if row == None: 
    break 
  print("%d, %s, %s, %s" % (row[0], row[1], row[2], row[3])) 
   
print("Number of rows returned: %d" % cursor.rowcount)
 
cursor.close () 
conn.close () 

接着展示数据库插入操作:

import cx_Oracle 
 
conn = cx_Oracle.connect('xzp/xzp@localhost/testdb')  
cursor = conn.cursor() 
 
cursor.execute ("CREATE TABLE INSERTTEST(ID INT, C1 VARCHAR(50), C2 VARCHAR(50), C3 VARCHAR(50))") 
 
cursor.execute ("INSERT INTO INSERTTEST (ID, COL1, COL2, COL3)VALUES(1213412, 'asdfa', 'ewewe', 'sfjgsfg')") 
cursor.execute ("INSERT INTO INSERTTEST (ID, COL1, COL2, COL3)VALUES(12341, 'ashdfh', 'shhsdfh', 'sghs')") 
cursor.execute ("INSERT INTO INSERTTEST (ID, COL1, COL2, COL3)VALUES(123451235, 'werwerw', 'asdfaf', 'awew')") 
conn.commit() #这里一定要commit才行,要不然数据是不会插入的 
 
cursor.close() 
conn.close()

7案例:从某网站爬取彩票号码

import re
import urllib
import cx_Oracle
import urllib.request

def getHtml(url):
	page = urllib.request.urlopen(url)
	html= page.read()
	return html
def getNumber(html):
	reg = r'<li class="ball_red">(\d{2})</li>'
	reg2 = r'<li class="ball_blue">(\d{2})</li>'
	regqnumber = r'第 <font class="cfont2"><strong>(\d*)</strong></font>'
	number = re.compile(reg)
	numberblue = re.compile(reg2)
	qnumber = re.compile(regqnumber)
	numberlist = re.findall(number,html.decode('gbk'))
	numberblue = re.findall(numberblue,html.decode('gbk'))
	qnum = re.findall(qnumber,html.decode('gbk'))
	for number in numberblue:
		numberlist.append(number)
	for n in qnum:
		numberlist.append(n)
	print(numberlist)
	return numberlist

	#将查询到的号码入库
def RecodeToOracle(list):
	conn = cx_Oracle.connect('xzp/xzp@localhost/testdb.domain')
	cur = conn.cursor()
	sql = "INSERT INTO SSQ (REDNUM1,REDNUM2,REDNUM3,REDNUM4,REDNUM5,REDNUM6,BLUENUM,QNUMBER) VALUES ('%s','%s','%s','%s','%s','%s','%s','%s')"%(list[0],list[1],list[2],list[3],list[4],list[5],list[6],list[7])
	cur.execute(sql)
	cur.close()
	conn.commit()#这里一定要提交,要不然是没有办法将数据入库的
	conn.close()#记得要关闭会话
def Geturl(html):
	reg = r'上一期:<a href="(.*)" rel="external nofollow" target="_blank">'
	url = re.compile(reg)
	urllist = re.findall(url,html.decode('gbk'))
	if len(urllist)!=0:
		print(urllist[0])
		if urllist[0].index('http:')<0:
			urllist[0]='http:'+urllist[0]
		htmlbefore = getHtml(urllist[0])
		# print(htmlbefore)
		numberlist = getNumber(htmlbefore)
		print(len(numberlist))
		RecodeToOracle(numberlist)
		print(numberlist)
		Geturl(htmlbefore)
	else:	
		return

str1 = '网站地址'
html1 = getHtml(str1)
RecodeToOracle(getNumber(html1))
Geturl(html1)

上述代码使用了递归运算来循环读取彩票信息,可一直读取至2003年第一期。由于采用递归方式,性能表现不佳,代码对内存消耗极大,电脑内存不足的用户请勿尝试,否则可能导致死机。

以上关于Python连接Oracle数据库及增删改查的实例分享完毕,希望能对读者有所帮助,也欢迎大家继续支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表