Python操作Mysql实例代码教程在线版(查询手册)_python
實例1、取得MYSQL的版本
在windows環(huán)境下安裝mysql模塊用于python開發(fā)
MySQL-python Windows下EXE安裝文件下載
# -*- coding: UTF-8 -*-
#安裝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()
??? #執(zhí)行一個查詢
??? cur.execute("SELECT VERSION()")
??? #取得上個查詢的結(jié)果,是單個結(jié)果
??? data = cur.fetchone()
??? print "Database version : %s " % data
finally:
??? if con:
??????? #無論如何,連接記得關(guān)閉
??????? con.close()
?
?執(zhí)行結(jié)果:
Database version : 5.5.25
實例2、創(chuàng)建一個表并且插入數(shù)據(jù)
主要還是在cursor上面執(zhí)行execute方法來進行,請見源碼:
復(fù)制代碼?代碼如下:# -*- coding: UTF-8 -*-
# 來源于總結(jié)整理
import MySQLdb as mdb
import sys
#將con設(shè)定為全局連接
con = mdb.connect('localhost', 'root', 'root', 'test');
with con:
??? #獲取連接的cursor,只有獲取了cursor,我們才能進行各種操作
??? cur = con.cursor()
??? #創(chuàng)建一個數(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')")
運行結(jié)果(在phpmyadmin中查看,在mysql命令行查看結(jié)果是一樣的):?
實例3、python使用slect獲取mysql的數(shù)據(jù)并遍歷
這個恐怕是用的最多的了,請速看代碼:
復(fù)制代碼?代碼如下:# -*- coding: UTF-8 -*-
# 來源:整理總結(jié)
import MySQLdb as mdb
import sys
#連接mysql,獲取連接的對象
con = mdb.connect('localhost', 'root', 'root', 'test');
with con:
??? #仍然是,第一步要獲取連接的cursor對象,用于執(zhí)行查詢
??? cur = con.cursor()
??? #類似于其他語言的query函數(shù),execute是python中的執(zhí)行查詢函數(shù)
??? cur.execute("SELECT * FROM Writers")
??? #使用fetchall函數(shù),將結(jié)果集(多維元組)存入rows里面
??? rows = cur.fetchall()
??? #依次遍歷結(jié)果集,發(fā)現(xiàn)每個元素,就是表中的一條記錄,用一個元組來顯示
??? for row in rows:
??????? print row
運行結(jié)果:
(1L, ‘Jack London')
(2L, ‘Honore de Balzac')
(3L, ‘Lion Feuchtwanger')
(4L, ‘Emile Zola')
(5L, ‘Truman Capote')
上面的代碼,用來將所有的結(jié)果取出,不過打印的時候是每行一個元祖打印,現(xiàn)在我們使用方法,取出其中的單個數(shù)據(jù):
復(fù)制代碼?代碼如下:# -*- coding: UTF-8 -*-
# 來源:瘋狂的螞蟻的博客總結(jié)整理
import MySQLdb as mdb
import sys
#獲取mysql的鏈接對象
con = mdb.connect('localhost', 'root', 'root', 'test');
with con:
??? #獲取執(zhí)行查詢的對象
??? cur = con.cursor()
??? #執(zhí)行那個查詢,這里用的是select語句
??? cur.execute("SELECT * FROM Writers")
??? #使用cur.rowcount獲取結(jié)果集的條數(shù)
??? numrows = int(cur.rowcount)
??? #循環(huán)numrows次,每次取出一行數(shù)據(jù)
??? for i in range(numrows):
??????? #每次取出一行,放到row中,這是一個元組(id,name)
??????? row = cur.fetchone()
??????? #直接輸出兩個元素
??????? print row[0], row[1]
?
?運行結(jié)果:
1 Jack London
2 Honore de Balzac
3 Lion Feuchtwanger
4 Emile Zola
5 Truman Capote
numrows = int(cur.rowcount)用于獲取結(jié)果集的數(shù)目?
row = cur.fetchone()每次取出一行數(shù)據(jù),同時記錄集的指針執(zhí)行下一行
實例4、使用字典cursor取得結(jié)果集(可以使用表字段名字訪問值)
?
復(fù)制代碼?代碼如下:# -*- coding: UTF-8 -*-
# 來源:瘋狂的螞蟻的博客總結(jié)整理
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)
??? #執(zhí)行語句不變
??? cur.execute("SELECT * FROM Writers")
??? #獲取數(shù)據(jù)方法不變
??? rows = cur.fetchall()
??? #遍歷數(shù)據(jù)也不變(比上一個更直接一點)
??? for row in rows:
??????? #這里,可以使用鍵值對的方法,由鍵名字來獲取數(shù)據(jù)
??????? print "%s %s" % (row["Id"], row["Name"])
實例5、獲取單個表的字段名和信息的方法
?
復(fù)制代碼?代碼如下:# -*- coding: UTF-8 -*-
# 來源:瘋狂的螞蟻的博客總結(jié)整理
import MySQLdb as mdb
import sys
#獲取數(shù)據(jù)庫的鏈接對象
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:
??????? #打印結(jié)果
??????? print "%2s %3s" % row
?
?運行結(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
實例6、使用Prepared statements執(zhí)行查詢(更安全方便)
?
復(fù)制代碼?代碼如下:# -*- coding: UTF-8 -*-
# 來源:瘋狂的螞蟻的博客總結(jié)整理
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
結(jié)果:
復(fù)制代碼?代碼如下:Number of rows updated: 1
實例7、把圖片用二進制存入MYSQL
有人喜歡把圖片存入MYSQL(這種做法貌似很少吧),我看大部分的程序,圖片都是存放在服務(wù)器上的文件,數(shù)據(jù)庫中存的只是圖片的地址而已,不過MYSQL是支持把圖片存入數(shù)據(jù)庫的,也相應(yīng)的有一個專門的字段BLOB (Binary Large Object),即較大的二進制對象字段,請看如下程序,注意測試圖片自己隨便找一個,地址要正確:
首先,在數(shù)據(jù)庫中創(chuàng)建一個表,用于存放圖片:
復(fù)制代碼?代碼如下:CREATE TABLE Images(Id INT PRIMARY KEY AUTO_INCREMENT, Data MEDIUMBLOB);
然后運行如下PYTHON代碼進行:
復(fù)制代碼?代碼如下:# -*- coding: UTF-8 -*-
# 來源:瘋狂的螞蟻的博客總結(jié)整理
import MySQLdb as mdb
import sys
try:
??? #用讀文件模式打開圖片
??? fin = open("../web.jpg")
??? #將文本讀入img對象中
??? img = fin.read()
??? #關(guān)閉文件
??? 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')
??? #獲取執(zhí)行cursor
??? cursor = conn.cursor()
??? #直接將數(shù)據(jù)作為字符串,插入數(shù)據(jù)庫
??? 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)
???
??? 結(jié)果:
escape_string函數(shù)將插入數(shù)據(jù)庫的字符串進行轉(zhuǎn)義,這會指一些SQL注入的攻擊
實例8、從數(shù)據(jù)庫中把圖片讀出來
?
復(fù)制代碼?代碼如下:# -*- coding: UTF-8 -*-
# 來源:瘋狂的螞蟻的博客總結(jié)整理
import MySQLdb as mdb
import sys
try:
??? #連接mysql,獲取連接的對象
??? conn = mdb.connect('localhost', 'root', 'root', 'test');
??? cursor = conn.cursor()
??? #執(zhí)行查詢該圖片字段的SQL
??? cursor.execute("SELECT Data FROM Images LIMIT 1")
??? #使用二進制寫文件的方法,打開一個圖片文件,若不存在則自動創(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的異常 ,主要是文件寫入會發(fā)生錯誤
??? print "Error %d: %s" % (e.args[0],e.args[1])
??? sys.exit(1)
?
??? 實例9、使用Transaction即事務(wù)(手動提交,自動回滾)
???
# -*- coding: UTF-8 -*-
# 來源:瘋狂的螞蟻的博客總結(jié)整理
import MySQLdb as mdb
import sys
try:
??? #連接mysql,獲取連接的對象
??? conn = mdb.connect('localhost', 'root', 'root', 'test');
??? cursor = conn.cursor()
??? #如果某個數(shù)據(jù)庫支持事務(wù),會自動開啟
??? #這里用的是MYSQL,所以會自動開啟事務(wù)(若是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"))??
??? #事務(wù)的特性1、原子性的手動提交
??? conn.commit()
??? cursor.close()
??? conn.close()
except mdb.Error, e:
??? #如果出現(xiàn)了錯誤,那么可以回滾,就是上面的三條語句要么執(zhí)行,要么都不執(zhí)行
??? conn.rollback()
??? print "Error %d: %s" % (e.args[0],e.args[1])
?
???
??? 結(jié)果:
1、因為不存在writer表(SQL第三條語句),所以出現(xiàn)錯誤:
Error 1146: Table ‘test.writer' doesn't exist
2、出現(xiàn)錯誤,出發(fā)異常處理,3條語句的前兩條會自動變成了沒有執(zhí)行,結(jié)果不變
3、如果本代碼放到一個MyISAM引擎表,前兩句會執(zhí)行,第三句不會;如果是INNDB引擎,則都不會執(zhí)行。
為方便大家本地瀏覽特提供一個pdf版本下載
全文完,本文翻譯自:http://zetcode.com/databases/mysqlpythontutorial/
以上是云棲社區(qū)小編為您精心準備的的內(nèi)容,在云棲社區(qū)的博客、問答、公眾號、人物、課程等欄目也有的相關(guān)內(nèi)容,歡迎繼續(xù)使用右上角搜索按鈕進行搜索Python操作Mysql python mysql 實例、python實例手冊、python實例手冊 雪松、python mysql手冊、python 操作redis實例,以便于您獲取更多的相關(guān)知識。
轉(zhuǎn)載于:https://www.cnblogs.com/adolfmc/p/7461306.html
總結(jié)
以上是生活随笔為你收集整理的Python操作Mysql实例代码教程在线版(查询手册)_python的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS解析格式化Json插件,Json和X
- 下一篇: MySQL 数据还原