python鏈接oracle數(shù)據(jù)庫(kù)以及數(shù)據(jù)庫(kù)的增刪改查實(shí)例
初次使用python鏈接oracle,所以想記錄下我遇到的問(wèn)題,便于向我這樣初次嘗試的朋友能夠快速的配置好環(huán)境進(jìn)入開(kāi)發(fā)環(huán)節(jié)。
1.首先,python鏈接oracle數(shù)據(jù)庫(kù)需要配置好環(huán)境。
我的相關(guān)環(huán)境如下:
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。這個(gè)是server版本號(hào),在鏈接oracle數(shù)據(jù)庫(kù)的時(shí)候還需要oracle的客戶(hù)端版,客戶(hù)端版本的下載也要參考python的版本,python是32位的客戶(hù)端下載也要用32位。
3)cx_Oracle:python鏈接oracle的驅(qū)動(dòng)包,這個(gè)需要自己安裝,https://pypi.python.org/pypi/cx_Oracle/5.3在這個(gè)網(wǎng)址中下載對(duì)應(yīng)的驅(qū)動(dòng),下載驅(qū)動(dòng)的時(shí)候一定要選好對(duì)應(yīng)的版本,我的python是3.6的32位版本,所以在下載驅(qū)動(dòng)的時(shí)候也要選擇對(duì)應(yīng)的版本,我選擇的版本是cx_Oracle-5.3-11g.win32-py3.6.exe (md5),下載后直接安裝運(yùn)行就行了,他會(huì)有一個(gè)自檢,如果沒(méi)有通過(guò)就說(shuō)明你的驅(qū)動(dòng)版本沒(méi)有下載對(duì)。
2.上面的工作做好之后,在剛才下載好的oracle客戶(hù)端版本中找到下面三個(gè)文件:oci.dll、oraocci11.dll、oraociei11.dll,將這幾個(gè)dll文件復(fù)制到
Python\Python36-32\Lib\site-packages文件夾中。
3.在python中輸入:
import cx_Oracle
沒(méi)有報(bào)錯(cuò)的話(huà)說(shuō)明驅(qū)動(dòng)安裝成功。
4.數(shù)據(jù)庫(kù)連接操作:
conn = cx_Oracle.connect('xzt/xzt@localhost/testdb')#這里的順序是用戶(hù)名/密碼@oracleserver的ip地址/數(shù)據(jù)庫(kù)名字 cur = conn.cursor() sql = "SELECT * FROM DUAL" cur.execute(sql) cur.close() conn.commit() conn.close()
5.數(shù)據(jù)庫(kù)查詢(xún):
import cx_Oracle conn = cx_Oracle.connect('xzt/xzt@localhost/testdb') cursor = conn.cursor () cursor.execute ("SELECT * FROM STUDENT_TB") rows = cursor.fetchall() #得到所有數(shù)據(jù)集 for row in rows: print("%d, %s, %s, %s" % (row[0], row[1], row[2], row[3]))#python3以上版本中print()要加括號(hào)用了 print("Number of rows returned: %d" % cursor.rowcount) cursor.execute ("SELECT * FROM STUDENT_TB") while (True): row = cursor.fetchone() #逐行得到數(shù)據(jù)集 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 ()
6.數(shù)據(jù)庫(kù)插入:
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才行,要不然數(shù)據(jù)是不會(huì)插入的 cursor.close() conn.close()
7案例:從某網(wǎng)站上面爬取彩票號(hào)碼
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 #將查詢(xún)到的號(hào)碼入庫(kù) 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()#這里一定要提交,要不然是沒(méi)有辦法將數(shù)據(jù)入庫(kù)的 conn.close()#記得要關(guān)閉會(huì)話(huà) 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 = '網(wǎng)站地址' html1 = getHtml(str1) RecodeToOracle(getNumber(html1)) Geturl(html1)
上面的代碼用了遞歸運(yùn)算,循環(huán)讀取彩票信息,可以一直讀取到2003年第一期,由于使用的是遞歸,在性能上不是很好,代碼非常吃?xún)?nèi)存,電腦內(nèi)存不夠的朋友就不要嘗試了,容易死機(jī)。
以上這篇python鏈接oracle數(shù)據(jù)庫(kù)以及數(shù)據(jù)庫(kù)的增刪改查實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
教你如何把Python CSV 合并到多個(gè)sheet工作表
今天我們要實(shí)現(xiàn)將多個(gè)CSV文件,合并到一個(gè)Excel文件中的,多個(gè)sheet工作表,網(wǎng)上大多方法都是將csv直接合并在一起,也不分別創(chuàng)建sheet表。接下來(lái)通過(guò)本文給大家詳細(xì)介紹下,需要的朋友參考下吧2021-11-11關(guān)于Numpy數(shù)據(jù)類(lèi)型對(duì)象(dtype)使用詳解
今天小編就為大家分享一篇關(guān)于Numpy數(shù)據(jù)類(lèi)型對(duì)象(dtype)使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11關(guān)于Pandas缺失值inf與nan的處理實(shí)踐
這篇文章主要介紹了關(guān)于Pandas缺失值inf與nan的處理實(shí)踐,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06基于python 開(kāi)立方的注意事項(xiàng)說(shuō)明
這篇文章主要介紹了基于python 開(kāi)立方的注意事項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03使用PIL(Python-Imaging)反轉(zhuǎn)圖像的顏色方法
今天小編就為大家分享一篇使用PIL(Python-Imaging)反轉(zhuǎn)圖像的顏色方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01