
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 python
import MySQLdb as mdb
con = None
try:
#連接 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 " % data
finally:
if con:
#無(wú)論如何,連接記得關(guān)閉
con.close()
實(shí)例 2、創(chuàng)建一個(gè)表并且插入數(shù)據(jù)
import MySQLdb as mdb
import 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 mdb
import 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 mdb
import 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 mdb
import 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ù)方法不變
rows = 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 mdb
import sys
#獲取數(shù)據(jù)庫(kù)的鏈接對(duì)象
con = mdb.connect('localhost', 'root', 'root', 'test')
with con:
#獲取普通的查詢 cursor
cur = con.cursor()
cur.execute("SELECT * FROM Writers")
rows = cur.fetchall()
#獲取連接對(duì)象的描述信息
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
運(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 mdb
import sys
con = mdb.connect('localhost', 'root', 'root', 'test')
with con:
cur = con.cursor()
#我們看到,這里可以通過(guò)寫(xiě)一個(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è)專門(mén)的字段 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 mdb
import sys
try:
#用讀文件模式打開(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í)行 cursor
cursor = 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)
實(shí)例 8、從數(shù)據(jù)庫(kù)中把圖片讀出來(lái)
import MySQLdb as mdb
import sys
try:
#連接 mysql,獲取連接的對(duì)象
conn = mdb.connect('localhost', 'root', 'root', 'test');
cursor = conn.cursor()
#執(zhí)行查詢?cè)搱D片字段的 SQL
cursor.execute("SELECT Data FROM Images LIMIT 1")
#使用二進(jìn)制寫(xiě)文件的方法,打開(kāi)一個(gè)圖片文件,若不存在則自動(dòng)創(chuàng)建
fout = open('image.png','wb')
#直接將數(shù)據(jù)如文件
fout.write(cursor.fetchone()[0])
#關(guān)閉寫(xiě)入的文件
fout.close()
#釋放查詢數(shù)據(jù)的資源
cursor.close()
conn.close()
except IOError, e:
#捕獲 IO 的異常 ,主要是文件寫(xiě)入會(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 mdb
import sys
try:
#連接 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í)有所幫助。
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
LSTM 模型輸入長(zhǎng)度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長(zhǎng)序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報(bào)考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計(jì)的實(shí)用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強(qiáng)大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠(chéng)摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實(shí)施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價(jià)值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡(jiǎn)稱 BI)深度融合的時(shí)代,BI ...
2025-07-10SQL 在預(yù)測(cè)分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢(shì)預(yù)判? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代,預(yù)測(cè)分析作為挖掘數(shù)據(jù)潛在價(jià)值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價(jià)值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點(diǎn),而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報(bào)考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭(zhēng)搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢(shì)性檢驗(yàn):捕捉數(shù)據(jù)背后的時(shí)間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢(shì)性檢驗(yàn)如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時(shí)間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時(shí)間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實(shí)戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗(yàn):數(shù)據(jù)趨勢(shì)與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢(shì)變化以及識(shí)別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國(guó)內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對(duì)策略? 長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨(dú)特的門(mén)控機(jī)制,在 ...
2025-07-07統(tǒng)計(jì)學(xué)方法在市場(chǎng)調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場(chǎng)調(diào)研是企業(yè)洞察市場(chǎng)動(dòng)態(tài)、了解消費(fèi)者需求的重要途徑,而統(tǒng)計(jì)學(xué)方法則是市場(chǎng)調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書(shū)考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動(dòng)力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動(dòng)力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開(kāi)啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價(jià)值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03