熱線電話:13121318867

登錄
首頁精彩閱讀python鏈接oracle數據庫以及數據庫的增刪改查實例
python鏈接oracle數據庫以及數據庫的增刪改查實例
2018-08-12
收藏

python鏈接oracle數據庫以及數據庫的增刪改查實例

初次使用python鏈接oracle,所以想記錄下我遇到的問題,便于向我這樣初次嘗試的朋友能夠快速的配置好環境進入開發環節。

1.首先,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。這個是server版本號,在鏈接oracle數據庫的時候還需要oracle的客戶端版,客戶端版本的下載也要參考python的版本,python是32位的客戶端下載也要用32位。

3)cx_Oracle:python鏈接oracle的驅動包,這個需要自己安裝,https://pypi.python.org/pypi/cx_Oracle/5.3在這個網址中下載對應的驅動,下載驅動的時候一定要選好對應的版本,我的python是3.6的32位版本,所以在下載驅動的時候也要選擇對應的版本,我選擇的版本是cx_Oracle-5.3-11g.win32-py3.6.exe (md5),下載后直接安裝運行就行了,他會有一個自檢,如果沒有通過就說明你的驅動版本沒有下載對。

2.上面的工作做好之后,在剛才下載好的oracle客戶端版本中找到下面三個文件:oci.dll、oraocci11.dll、oraociei11.dll,將這幾個dll文件復制到

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

3.在python中輸入:    
import cx_Oracle

沒有報錯的話說明驅動安裝成功。

4.數據庫連接操作:    
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()

5.數據庫查詢:    
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 ()

6.數據庫插入:    
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年第一期,由于使用的是遞歸,在性能上不是很好,代碼非常吃內存,電腦內存不夠的朋友就不要嘗試了,容易死機。

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢