在Windows平台上安裝mysql模組用於Python開發
用python串連mysql的時候,需要用的安裝版本,源碼版本容易有錯誤提示。下邊是打包了32與64版本。
MySQL-python-1.2.3.win32-py2.7.exe
MySQL-python-1.2.3.win-amd64-py2.7.exe
執行個體 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 的一個模組 cursor 上面啟動並執行 cur = con.cursor() #執行一個查詢 cur.execute("SELECT VERSION()") #取得上個查詢的結果,是單個結果 data = cur.fetchone() print "Database version : %s " % datafinally: if con: #無論如何,串連記得關閉 con.close()
執行個體 2、建立一個表並且插入資料
import MySQLdb as mdbimport sys#將 con 設定為全域串連con = mdb.connect('localhost', 'root', 'root', 'test');with con:#擷取串連的 cursor,只有擷取了 cursor,我們才能進行各種操作cur = con.cursor()#建立一個資料表 writers(id,name)cur.execute("CREATE TABLE IF NOT EXISTS \Writers(Id INT PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(25))")#以下插入了 5 條資料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')")
執行個體 3、 python 使用 slect 擷取 mysql 的資料並遍曆
import MySQLdb as mdbimport sys#串連 mysql,擷取串連的對象con = mdb.connect('localhost', 'root', 'root', 'test');with con:#仍然是,第一步要擷取串連的 cursor 對象,用於執行查詢cur = con.cursor()#類似於其他語言的 query 函數, execute 是 python 中的執行查詢函數cur.execute("SELECT * FROM Writers")#使用 fetchall 函數,將結果集(多維元組)存入 rows 裡面rows = cur.fetchall()#依次遍曆結果集,發現每個元素,就是表中的一條記錄,用一個元組來顯示for row in rows:print row
運行結果:
(1L, ‘Jack London')
(2L, ‘Honore de Balzac')
(3L, ‘Lion Feuchtwanger')
(4L, ‘Emile Zola')
(5L, ‘Truman Capote')
上面的代碼,用來將所有的結果取出,不過列印的時候是每行一個元祖列印,現在我們使用方法,取出其中的單個資料:
import MySQLdb as mdbimport sys#擷取 mysql 的連結化物件con = mdb.connect('localhost', 'root', 'root', 'test');with con:#擷取執行查詢的對象cur = con.cursor()#執行那個查詢,這裡用的是 select 語句cur.execute("SELECT * FROM Writers")#使用 cur.rowcount 擷取結果集的條數numrows = int(cur.rowcount)#迴圈 numrows 次,每次取出一行資料for i in range(numrows):#每次取出一行,放到 row 中,這是一個元組(id,name)row = cur.fetchone()#直接輸出兩個元素print row[0], row[1]
運行結果:
1 Jack London
2 Honore de Balzac
3 Lion Feuchtwanger
4 Emile Zola
5 Truman Capote
執行個體 4、使用字典 cursor 取得結果集(可以使用表欄位名字訪問值)
import MySQLdb as mdbimport sys#獲得 mySQL 查詢的連結化物件con = mdb.connect('localhost', 'root', 'root', 'test')with con:#擷取串連上的字典 cursor,注意擷取的方法,#每一個 cursor 其實都是 cursor 的子類cur = con.cursor(mdb.cursors.DictCursor)#執行語句不變cur.execute("SELECT * FROM Writers")#擷取資料方法不變rows = cur.fetchall()#遍曆資料也不變(比上一個更直接一點)for row in rows:#這裡,可以使用索引值對的方法,由鍵名字來擷取資料print "%s %s" % (row["Id"], row["Name"])
執行個體 5、擷取單個表的欄位名和資訊的方法
import MySQLdb as mdbimport sys#擷取資料庫的連結化物件con = mdb.connect('localhost', 'root', 'root', 'test')with con:#擷取普通的查詢 cursorcur = con.cursor()cur.execute("SELECT * FROM Writers")rows = cur.fetchall()#擷取連線物件的描述資訊desc = cur.descriptionprint 'cur.description:',desc#列印表頭,就是欄位名字print "%s %3s" % (desc[0][0], desc[1][0])for row in rows:#列印結果print "%2s %3s" % row
運行結果:
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
執行個體 6、使用 Prepared statements 執行查詢(更安全方便)
import MySQLdb as mdbimport syscon = mdb.connect('localhost', 'root', 'root', 'test')with con:cur = con.cursor()#我們看到,這裡可以通過寫一個可以組裝的 sql 語句來進行cur.execute("UPDATE Writers SET Name = %s WHERE Id = %s",("Guy de Maupasant", "4"))#使用 cur.rowcount 擷取影響了多少行print "Number of rows updated: %d" % cur.rowcount
結果:
Number of rows updated: 1
執行個體 7、把圖片用二進位存入 MYSQL
有人喜歡把圖片存入 MYSQL(這種做法貌似很少吧),我看大部分的程式,圖片都是存放在伺服器上的檔案,資料庫中存的只是圖片的地址而已,不過 MYSQL 是支援把圖片存入資料庫的,也相應的有一個專門的欄位 BLOB (Binary Large Object),即較大的二進位對象欄位,請看如下程式,注意測試圖片自己隨便找一個,地址要正確:
首先,在資料庫中建立一個表,用於存放圖片:
複製代碼 代碼如下:
CREATE TABLE Images(Id INT PRIMARY KEY AUTO_INCREMENT, Data MEDIUMBLOB);
然後運行如下 PYTHON 代碼進行:
import MySQLdb as mdbimport systry:#用讀檔案模式開啟圖片fin = open("../web.jpg")#將文本讀入 img 對象中img = fin.read()#關閉檔案fin.close()except IOError, e:#如果出錯,列印錯誤資訊print "Error %d: %s" % (e.args[0],e.args[1])sys.exit(1)try:#連結 mysql,擷取對象conn = mdb.connect(host='localhost',user='root',passwd='root',db='test')#擷取執行 cursorcursor = conn.cursor()#直接將資料作為字串,插入資料庫cursor.execute("INSERT INTO Images SET Data='%s'" %mdb.escape_string(img))#提交資料conn.commit()#提交之後,再關閉 cursor 和連結cursor.close()conn.close()except mdb.Error, e:#若出現異常,列印資訊print "Error %d: %s" % (e.args[0],e.args[1])sys.exit(1)
執行個體 8、從資料庫中把圖片讀出來
import MySQLdb as mdbimport systry:#串連 mysql,擷取串連的對象conn = mdb.connect('localhost', 'root', 'root', 'test');cursor = conn.cursor()#執行查詢該圖片欄位的 SQLcursor.execute("SELECT Data FROM Images LIMIT 1")#使用二進位寫檔案的方法,開啟一個圖片檔案,若不存在則自動建立fout = open('image.png','wb')#直接將資料如檔案fout.write(cursor.fetchone()[0])#關閉寫入的檔案fout.close()#釋放查詢資料的資源cursor.close()conn.close()except IOError, e:#捕獲 IO 的異常 ,主要是檔案寫入會發生錯誤print "Error %d: %s" % (e.args[0],e.args[1])sys.exit(1)
執行個體 9、使用 Transaction 即事務(手動提交,自動復原)
import MySQLdb as mdbimport systry:#串連 mysql,擷取串連的對象conn = mdb.connect('localhost', 'root', 'root', 'test');cursor = conn.cursor()#如果某個資料庫支援事務,會自動開啟#這裡用的是 MYSQL,所以會自動開啟事務(若是 MYISM 引擎則不會)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"))#事務的特性 1、原子性的手動提交conn.commit()cursor.close()conn.close()except mdb.Error, e:#如果出現了錯誤,那麼可以復原,就是上面的三條語句要麼執行,要麼都不執行conn.rollback()print "Error %d: %s" % (e.args[0],e.args[1])
結果:
1、因為不存在 writer 表( SQL 第三條語句),所以出現錯誤:Error 1146: Table ‘test.writer' doesn't exist
2、出現錯誤,出發異常處理, 3 條語句的前兩條會自動變成了沒有執行,結果不變
3、如果本代碼放到一個 MyISAM 引擎表,前兩句會執行,第三句不會;如果是 INNDB 引擎,則都不會執行。
以上就是為大家分享的9個實用的Python操作MySQL資料庫執行個體,希望對大家的學習有所協助。