国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

Python操作MySQL數(shù)據(jù)庫(kù)9個(gè)實(shí)用實(shí)例

2020-01-04 17:54:58
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
這篇文章主要介紹了Python操作MySQL數(shù)據(jù)庫(kù)9個(gè)實(shí)用實(shí)例,需要的朋友可以參考下
 

在Windows平臺(tái)上安裝mysql模塊用于Python開(kāi)發(fā)

用python連接mysql的時(shí)候,需要用的安裝版本,源碼版本容易有錯(cuò)誤提示。下邊是打包了32與64版本。 
MySQL-python-1.2.3.win32-py2.7.exe 
MySQL-python-1.2.3.win-amd64-py2.7.exe

實(shí)例 1、取得 MYSQL 的版本

# -*- coding: UTF-8 -*-#安裝 MYSQL DB for pythonimport MySQLdb as mdbcon = Nonetry:  #連接 mysql 的方法: connect('ip','user','password','dbname')  con = mdb.connect('localhost', 'root','root', 'test');  #所有的查詢,都在連接 con 的一個(gè)模塊 cursor 上面運(yùn)行的  cur = con.cursor()  #執(zhí)行一個(gè)查詢  cur.execute("SELECT VERSION()")  #取得上個(gè)查詢的結(jié)果,是單個(gè)結(jié)果  data = cur.fetchone()  print "Database version : %s " % datafinally:  if con:    #無(wú)論如何,連接記得關(guān)閉    con.close()

實(shí)例 2、創(chuàng)建一個(gè)表并且插入數(shù)據(jù)

import MySQLdb as mdbimport sys#將 con 設(shè)定為全局連接con = mdb.connect('localhost', 'root', 'root', 'test');with con:#獲取連接的 cursor,只有獲取了 cursor,我們才能進(jìn)行各種操作cur = con.cursor()#創(chuàng)建一個(gè)數(shù)據(jù)表 writers(id,name)cur.execute("CREATE TABLE IF NOT EXISTS /Writers(Id INT PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(25))")#以下插入了 5 條數(shù)據(jù)cur.execute("INSERT INTO Writers(Name) VALUES('Jack London')")cur.execute("INSERT INTO Writers(Name) VALUES('Honore de Balzac')")cur.execute("INSERT INTO Writers(Name) VALUES('Lion Feuchtwanger')")cur.execute("INSERT INTO Writers(Name) VALUES('Emile Zola')")cur.execute("INSERT INTO Writers(Name) VALUES('Truman Capote')")

實(shí)例 3、 python 使用 slect 獲取 mysql 的數(shù)據(jù)并遍歷

import MySQLdb as mdbimport sys#連接 mysql,獲取連接的對(duì)象con = mdb.connect('localhost', 'root', 'root', 'test');with con:#仍然是,第一步要獲取連接的 cursor 對(duì)象,用于執(zhí)行查詢cur = con.cursor()#類似于其他語(yǔ)言的 query 函數(shù), execute 是 python 中的執(zhí)行查詢函數(shù)cur.execute("SELECT * FROM Writers")#使用 fetchall 函數(shù),將結(jié)果集(多維元組)存入 rows 里面rows = cur.fetchall()#依次遍歷結(jié)果集,發(fā)現(xiàn)每個(gè)元素,就是表中的一條記錄,用一個(gè)元組來(lái)顯示for row in rows:print row

運(yùn)行結(jié)果:

(1L, ‘Jack London')
(2L, ‘Honore de Balzac')
(3L, ‘Lion Feuchtwanger')
(4L, ‘Emile Zola')
(5L, ‘Truman Capote')
上面的代碼,用來(lái)將所有的結(jié)果取出,不過(guò)打印的時(shí)候是每行一個(gè)元祖打印,現(xiàn)在我們使用方法,取出其中的單個(gè)數(shù)據(jù):

import MySQLdb as mdbimport sys#獲取 mysql 的鏈接對(duì)象con = mdb.connect('localhost', 'root', 'root', 'test');with con:#獲取執(zhí)行查詢的對(duì)象cur = con.cursor()#執(zhí)行那個(gè)查詢,這里用的是 select 語(yǔ)句cur.execute("SELECT * FROM Writers")#使用 cur.rowcount 獲取結(jié)果集的條數(shù)numrows = int(cur.rowcount)#循環(huán) numrows 次,每次取出一行數(shù)據(jù)for i in range(numrows):#每次取出一行,放到 row 中,這是一個(gè)元組(id,name)row = cur.fetchone()#直接輸出兩個(gè)元素print row[0], row[1]

運(yùn)行結(jié)果:

1 Jack London
2 Honore de Balzac
3 Lion Feuchtwanger
4 Emile Zola
5 Truman Capote
實(shí)例 4、使用字典 cursor 取得結(jié)果集(可以使用表字段名字訪問(wèn)值)

import MySQLdb as mdbimport sys#獲得 mysql 查詢的鏈接對(duì)象con = mdb.connect('localhost', 'root', 'root', 'test')with con:#獲取連接上的字典 cursor,注意獲取的方法,#每一個(gè) cursor 其實(shí)都是 cursor 的子類cur = con.cursor(mdb.cursors.DictCursor)#執(zhí)行語(yǔ)句不變cur.execute("SELECT * FROM Writers")#獲取數(shù)據(jù)方法不變r(jià)ows = cur.fetchall()#遍歷數(shù)據(jù)也不變(比上一個(gè)更直接一點(diǎn))for row in rows:#這里,可以使用鍵值對(duì)的方法,由鍵名字來(lái)獲取數(shù)據(jù)print "%s %s" % (row["Id"], row["Name"])

實(shí)例 5、獲取單個(gè)表的字段名和信息的方法

import MySQLdb as mdbimport sys#獲取數(shù)據(jù)庫(kù)的鏈接對(duì)象con = mdb.connect('localhost', 'root', 'root', 'test')with con:#獲取普通的查詢 cursorcur = con.cursor()cur.execute("SELECT * FROM Writers")rows = cur.fetchall()#獲取連接對(duì)象的描述信息desc = cur.descriptionprint 'cur.description:',desc#打印表頭,就是字段名字print "%s %3s" % (desc[0][0], desc[1][0])for row in rows:#打印結(jié)果print "%2s %3s" % row

運(yùn)行結(jié)果:

cur.description: ((‘Id', 3, 1, 11, 11, 0, 0), (‘Name', 253, 17, 25, 25, 0, 1))
Id Name
1 Jack London
2 Honore de Balzac
3 Lion Feuchtwanger
4 Emile Zola
5 Truman Capote
實(shí)例 6、使用 Prepared statements 執(zhí)行查詢(更安全方便)

import MySQLdb as mdbimport syscon = mdb.connect('localhost', 'root', 'root', 'test')with con:cur = con.cursor()#我們看到,這里可以通過(guò)寫一個(gè)可以組裝的 sql 語(yǔ)句來(lái)進(jìn)行cur.execute("UPDATE Writers SET Name = %s WHERE Id = %s",("Guy de Maupasant", "4"))#使用 cur.rowcount 獲取影響了多少行print "Number of rows updated: %d" % cur.rowcount

結(jié)果:
Number of rows updated: 1

實(shí)例 7、把圖片用二進(jìn)制存入 MYSQL

有人喜歡把圖片存入 MYSQL(這種做法貌似很少吧),我看大部分的程序,圖片都是存放在服務(wù)器上的文件,數(shù)據(jù)庫(kù)中存的只是圖片的地址而已,不過(guò) MYSQL 是支持把圖片存入數(shù)據(jù)庫(kù)的,也相應(yīng)的有一個(gè)專門的字段 BLOB (Binary Large Object),即較大的二進(jìn)制對(duì)象字段,請(qǐng)看如下程序,注意測(cè)試圖片自己隨便找一個(gè),地址要正確: 
首先,在數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)表,用于存放圖片:

 

復(fù)制代碼代碼如下:
CREATE TABLE Images(Id INT PRIMARY KEY AUTO_INCREMENT, Data MEDIUMBLOB);

 

然后運(yùn)行如下 PYTHON 代碼進(jìn)行:

 

import MySQLdb as mdbimport systry:#用讀文件模式打開(kāi)圖片fin = open("../web.jpg")#將文本讀入 img 對(duì)象中img = fin.read()#關(guān)閉文件fin.close()except IOError, e:#如果出錯(cuò),打印錯(cuò)誤信息print "Error %d: %s" % (e.args[0],e.args[1])sys.exit(1)try:#鏈接 mysql,獲取對(duì)象conn = mdb.connect(host='localhost',user='root',passwd='root',db='test')#獲取執(zhí)行 cursorcursor = conn.cursor()#直接將數(shù)據(jù)作為字符串,插入數(shù)據(jù)庫(kù)cursor.execute("INSERT INTO Images SET Data='%s'" %mdb.escape_string(img))#提交數(shù)據(jù)conn.commit()#提交之后,再關(guān)閉 cursor 和鏈接cursor.close()conn.close()except mdb.Error, e:#若出現(xiàn)異常,打印信息print "Error %d: %s" % (e.args[0],e.args[1])sys.exit(1)

Python操作MySQL數(shù)據(jù)庫(kù)9個(gè)實(shí)用實(shí)例

實(shí)例 8、從數(shù)據(jù)庫(kù)中把圖片讀出來(lái)

import MySQLdb as mdbimport systry:#連接 mysql,獲取連接的對(duì)象conn = mdb.connect('localhost', 'root', 'root', 'test');cursor = conn.cursor()#執(zhí)行查詢?cè)搱D片字段的 SQLcursor.execute("SELECT Data FROM Images LIMIT 1")#使用二進(jìn)制寫文件的方法,打開(kāi)一個(gè)圖片文件,若不存在則自動(dòng)創(chuàng)建fout = open('image.png','wb')#直接將數(shù)據(jù)如文件fout.write(cursor.fetchone()[0])#關(guān)閉寫入的文件fout.close()#釋放查詢數(shù)據(jù)的資源cursor.close()conn.close()except IOError, e:#捕獲 IO 的異常 ,主要是文件寫入會(huì)發(fā)生錯(cuò)誤print "Error %d: %s" % (e.args[0],e.args[1])sys.exit(1)

實(shí)例 9、使用 Transaction 即事務(wù)(手動(dòng)提交,自動(dòng)回滾)

import MySQLdb as mdbimport systry:#連接 mysql,獲取連接的對(duì)象conn = mdb.connect('localhost', 'root', 'root', 'test');cursor = conn.cursor()#如果某個(gè)數(shù)據(jù)庫(kù)支持事務(wù),會(huì)自動(dòng)開(kāi)啟#這里用的是 MYSQL,所以會(huì)自動(dòng)開(kāi)啟事務(wù)(若是 MYISM 引擎則不會(huì))cursor.execute("UPDATE Writers SET Name = %s WHERE Id = %s",("Leo Tolstoy", "1"))cursor.execute("UPDATE Writers SET Name = %s WHERE Id = %s",("Boris Pasternak", "2"))cursor.execute("UPDATE Writer SET Name = %s WHERE Id = %s",("Leonid Leonov", "3"))#事務(wù)的特性 1、原子性的手動(dòng)提交conn.commit()cursor.close()conn.close()except mdb.Error, e:#如果出現(xiàn)了錯(cuò)誤,那么可以回滾,就是上面的三條語(yǔ)句要么執(zhí)行,要么都不執(zhí)行conn.rollback()print "Error %d: %s" % (e.args[0],e.args[1])

結(jié)果: 
1、因?yàn)椴淮嬖?writer 表( SQL 第三條語(yǔ)句),所以出現(xiàn)錯(cuò)誤:Error 1146: Table ‘test.writer' doesn't exist 
2、出現(xiàn)錯(cuò)誤,出發(fā)異常處理, 3 條語(yǔ)句的前兩條會(huì)自動(dòng)變成了沒(méi)有執(zhí)行,結(jié)果不變 
3、如果本代碼放到一個(gè) MyISAM 引擎表,前兩句會(huì)執(zhí)行,第三句不會(huì);如果是 INNDB 引擎,則都不會(huì)執(zhí)行。

以上就是為大家分享的9個(gè)實(shí)用的Python操作MySQL數(shù)據(jù)庫(kù)實(shí)例,希望對(duì)大家的學(xué)習(xí)有所幫助。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宁陵县| 罗甸县| 龙口市| 凭祥市| 张家港市| 蓬莱市| 巴马| 霍邱县| 石首市| 武强县| 梅州市| 昌宁县| 新和县| 通城县| 贺州市| 孟津县| 洛宁县| 凤山市| 肇庆市| 沙湾县| 闽侯县| 赣州市| 武强县| 即墨市| 宣汉县| 河东区| 定陶县| 城固县| 丹寨县| 左权县| 富蕴县| 华亭县| 阿坝| 兴业县| 新乡市| 朝阳县| 保山市| 宣城市| 太康县| 海南省| 麻江县|