python操作MySQL、執行SQL語句、獲取結果集、遍歷結果集、取得謀個字段、獲取表字段名、將圖片插入數據庫、執行事務等各種代碼示例和詳細介紹,代碼居多。
實例一: 取得MySQL的版本
在window環境下安裝 mysql 模塊用於 python 開發
#安裝 MYSQL DB for python import MySQLdb as mdb con = None try: #連接 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 " % data finally: if con: #無論如何,連接記得關閉 con.close()
執行結果:
Database version : 5.5.25
實例 2 創建一個表並且插入數據
主要還是在 cursor 上面執行 execute 方法來進行,請見源碼:
import MySQLdb as mdb import 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')")
運行結果(在 phpmyadmin 中查看,在 mysql 命令行查看結果是一樣的):
實例 3 、python 使用 slect 獲取 mysql 的數據並遍歷
這個恐怕是用的最多的了,請速看代碼:
import MySQLdb as mdb import 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 mdb import 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
numrows = int(cur.rowcount)用於獲取結果集的數目
row = cur.fetchone()每次取出一行數據,同時記錄集的指針執行下一行
實例 4 、使用字典 cursor 取得結果集(可以使用表字段名字訪問值)
import MySQLdb as mdb import 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 mdb import sys #獲取數據庫的鏈接對象 con = mdb.connect('localhost', 'root', 'root', 'test') with con: #獲取普通的查詢 cursor cur = con.cursor() cur.execute("SELECT * FROM Writers") rows = cur.fetchall() #獲取連接對象的描述信息 desc = cur.description print '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 mdb import sys con = 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 代碼進行:
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') #獲取執行 cursor cursor = 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)
結果:
escape_string 函數將插入數據庫的字符串進行轉義,這會指一些 SQL 注入的攻擊
實例 8 從數據庫中把圖片讀出來
import MySQLdb as mdb import sys try: #連接 mysql,獲取連接的對象 conn = mdb.connect('localhost', 'root', 'root', 'test'); cursor = conn.cursor() #執行查詢該圖片字段的 SQL cursor.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 mdb import sys try: #連接 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 引
擎,則都不會執行。