
Python操作MySQL數(shù)據(jù)庫9個實用實例
在Windows平臺上安裝mysql模塊用于Python開發(fā)
用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 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()
實例 2、創(chuàng)建一個表并且插入數(shù)據(jù)
import MySQLdb as mdb
import sys
#將 con 設定為全局連接
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')")
實例 3、 python 使用 slect 獲取 mysql 的數(shù)據(jù)并遍歷
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ù):
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
實例 4、使用字典 cursor 取得結(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、獲取單個表的字段名和信息的方
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í)行查詢(更安全方便)
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é)果:
Number of rows updated: 1
實例 7、把圖片用二進制存入 MYSQL
有人喜歡把圖片存入 MYSQL(這種做法貌似很少吧),我看大部分的程序,圖片都是存放在服務器上的文件,數(shù)據(jù)庫中存的只是圖片的地址而已,不過 MYSQL 是支持把圖片存入數(shù)據(jù)庫的,也相應的有一個專門的字段 BLOB (Binary Large Object),即較大的二進制對象字段,請看如下程序,注意測試圖片自己隨便找一個,地址要正確:
首先,在數(shù)據(jù)庫中創(chuàng)建一個表,用于存放圖片:
復制代碼 代碼如下:
CREATE TABLE Images(Id INT PRIMARY KEY AUTO_INCREMENT, Data MEDIUMBLOB);
然后運行如下 PYTHON 代碼進行:
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)
實例 8、從數(shù)據(jù)庫中把圖片讀出來
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 即事務(手動提交,自動回滾)
import MySQLdb as mdb
import sys
try:
#連接 mysql,獲取連接的對象
conn = mdb.connect('localhost', 'root', 'root', 'test');
cursor = conn.cursor()
#如果某個數(shù)據(jù)庫支持事務,會自動開啟
#這里用的是 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:
#如果出現(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í)行。
以上就是為大家分享的9個實用的Python操作MySQL數(shù)據(jù)庫實例,希望對大家的學習有所幫助。
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎用法到實戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預期算子的內(nèi)涵、作用與應用解析 動態(tài)隨機一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實戰(zhàn)應用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時,“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗與 t 檢驗:差異、適用場景與實踐應用 在數(shù)據(jù)分析與統(tǒng)計學領(lǐng)域,假設檢驗是驗證研究假設、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計劃中 rows 數(shù)量的準確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實踐指南 在 Python 進行 HTTP 網(wǎng)絡請求開發(fā)時(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點數(shù)據(jù)的科學計數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點數(shù)據(jù)時的科學計數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務數(shù)據(jù)分析步驟的落地者與價值優(yōu)化者 業(yè)務數(shù)據(jù)分析是企業(yè)解決日常運營問題、提升執(zhí)行效率的核心手段,其價值 ...
2025-09-12用 SQL 驗證業(yè)務邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實戰(zhàn)指南 在業(yè)務系統(tǒng)落地過程中,“業(yè)務邏輯” 是連接 “需求設計” 與 “用戶體驗 ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動下的精準零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當下,精準營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務數(shù)據(jù)分析:概念辨析與協(xié)同價值 在數(shù)據(jù)驅(qū)動決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實踐到業(yè)務價值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價值導向 統(tǒng)計模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10