全棧 - 12 數(shù)據(jù)庫(kù) 用Python操作MySQL

這是全棧數(shù)據(jù)工程師養(yǎng)成攻略系列教程的第十二期:12 數(shù)據(jù)庫(kù) 用Python操作MySQL舵盈。

我們已經(jīng)接觸了如何使用Web工具phpMyAdmin和本地軟件Navicat操作MySQL边坤,現(xiàn)在再來(lái)了解下如何使用Python操作MySQL。

MySQLdb

MySQLdb是Python中操作MySQL的功能包辈讶,在命令行中使用pip安裝即可汹粤。

pip install mysql-python

如果可以在Python中import成功旦万,則表示安裝沒(méi)有問(wèn)題棋恼,否則還得繼續(xù)折騰。不過(guò)安裝和配置等事情畢竟是一勞永逸的脂崔,糾結(jié)一次滤淳,受益終身,絕知此事須躬行砌左。

import MySQLdb

建立連接

在Sublime中新建一個(gè)代碼脖咐,首先需要import相關(guān)的包铺敌。

import MySQLdb
import MySQLdb.cursors

打開(kāi)MAMP或者WAMP并啟動(dòng)Web服務(wù),使得MySQL運(yùn)行起來(lái)屁擅,可以通過(guò)訪問(wèn)phpMyAdmin管理頁(yè)面以確認(rèn)MySQL成功運(yùn)行偿凭。然后,使用以下代碼即可建立MySQL數(shù)據(jù)庫(kù)連接派歌,其中host為數(shù)據(jù)庫(kù)的主機(jī)地址弯囊,可以使用127.0.0.1localhost表示本機(jī),user和passwd分別為數(shù)據(jù)庫(kù)的用戶名和密碼胶果,db表示接下來(lái)要操作的數(shù)據(jù)庫(kù)常挚,port和charset表示連接的端口和字符集。以上參數(shù)分別替換成實(shí)際值即可稽物,這里我們使用之前在本機(jī)數(shù)據(jù)庫(kù)中新建的douban數(shù)據(jù)庫(kù),得到的cursor變量可用于執(zhí)行后續(xù)數(shù)據(jù)庫(kù)操作折欠。如果需要連接云端服務(wù)器的數(shù)據(jù)庫(kù)贝或,使用相應(yīng)的配置參數(shù)即可。

db = MySQLdb.connect(host='127.0.0.1', user='root', passwd='root', db='douban', port=8889, charset='utf8', cursorclass = MySQLdb.cursors.DictCursor)
db.autocommit(True)
cursor = db.cursor()

執(zhí)行操作

和數(shù)據(jù)庫(kù)相關(guān)的操作無(wú)非CURD四種锐秦,即Create咪奖、Update、Read酱床、Delete。要用到的數(shù)據(jù)可以在我的Github上找到昧捷,里面的data文件夾中除了上次的西游記小說(shuō)罐寨,還包括這次要用到的douban_movie_clean.txt靡挥,其中包含一行表頭,之后每一行都是一條電影數(shù)據(jù)鸯绿,包括id跋破、title瓶蝴、url、cover舷手、rate等15個(gè)字段拧簸,字段之間以^分割,主要是避免中文內(nèi)容里包括逗號(hào)導(dǎo)致沖突聚霜。

首先來(lái)看下如何向數(shù)據(jù)表中插入數(shù)據(jù)珠叔,以下代碼讀取douban_movie_clean.txt中的數(shù)據(jù)并逐條插入數(shù)據(jù)表中弟劲。需要注意的是,數(shù)據(jù)表的結(jié)構(gòu)應(yīng)當(dāng)和需要插入的字段保持一致兔乞,即movie表應(yīng)當(dāng)中包含主鍵id、標(biāo)題title霍骄、鏈接url、評(píng)分rate读整、時(shí)長(zhǎng)length咱娶、簡(jiǎn)介description六個(gè)字段。

# 讀取數(shù)據(jù)
fr = open('douban_movie_clean.txt', 'r')

count = 0
for line in fr:
    count += 1
    # count表示當(dāng)前處理到第幾行了
    print count
    # 跳過(guò)表頭
    if count == 1:
        continue

    # strip()函數(shù)可以去掉字符串兩端的空白符
    # split()函數(shù)按照給定的分割符將字符串分割為列表
    line = line.strip().split('^')
    # 插入數(shù)據(jù)屈糊,注意對(duì)齊字段
    # execute()函數(shù)第一個(gè)參數(shù)為要執(zhí)行的SQL命令
    # 這里用字符串格式化的方法生成一個(gè)模板
    # %s表示一個(gè)占位符
    # 第二個(gè)參數(shù)為需要格式化的參數(shù)琼了,傳入到模板中
    cursor.execute("insert into movie(title, url, rate, length, description) values(%s, %s, %s, %s, %s)", [line[1], line[2], line[4], line[-3], line[-1]])

# 關(guān)閉讀文件
fr.close()

運(yùn)行以上代碼之后,在phpMyAdmin中選擇douban數(shù)據(jù)庫(kù)中的movie表昧诱,在Browse標(biāo)簽頁(yè)下即可看到成功插入的數(shù)據(jù)所袁。點(diǎn)擊SQL標(biāo)簽,輸入Select count(*) from movie并點(diǎn)擊Go執(zhí)行SQL命令纲熏,可以統(tǒng)計(jì)數(shù)據(jù)表中一共有多少條數(shù)據(jù)記錄。

接下來(lái)再了解下如何更新數(shù)據(jù)庫(kù)中的數(shù)據(jù)局劲。SQL命令可以根據(jù)給定的條件,更新滿足條件的記錄药有,例如改變記錄中的某些字段。既然每條數(shù)據(jù)都有唯一的主鍵id愤惰,不妨將id作為條件進(jìn)行更新。當(dāng)然也可以做一些更有意義的更新扇单,例如添加一個(gè)“電影時(shí)長(zhǎng)分類(lèi)”字段奠旺,然后對(duì)于每條記錄,如果時(shí)長(zhǎng)大于100鄙信,則“電影時(shí)長(zhǎng)分類(lèi)”更新為“長(zhǎng)電影”忿晕,否則更新為“短電影”。

# 更新需要提供條件践盼、需要更新的字段、更新的新值
# 以下對(duì)于id為1的記錄,將其title和length兩個(gè)字段進(jìn)行更新
cursor.execute("update movie set title=%s, length=%s where id=%s", ['全棧數(shù)據(jù)工程師養(yǎng)成攻略', 999, 1])

運(yùn)行以上代碼之后谅河,在phpMyAdmin中Browse標(biāo)簽頁(yè)下即可看到确丢,id為1的記錄相應(yīng)字段確實(shí)已經(jīng)得到了更新。

然后就是最常用的讀取操作鲜侥,一方面是取出已有的數(shù)據(jù)進(jìn)行加工和計(jì)算得到新的結(jié)果并再次存儲(chǔ),另一方面是在Web項(xiàng)目中從后端取出數(shù)據(jù)傳遞到前端展示崎苗。讀取數(shù)據(jù)時(shí)可以僅讀取一條舀寓,也可以選擇多條;可以讀取全部字段必尼,也可以選擇部分字段;還可以按某個(gè)字段進(jìn)行排序判莉,使得讀取多條數(shù)據(jù)時(shí)的結(jié)果有序排列。

# 讀取全部數(shù)據(jù)的全部字段
cursor.execute("select * from movie")
movies = cursor.fetchall()
# 返回元組帮哈,每一項(xiàng)都是一個(gè)字典
# 對(duì)應(yīng)一條記錄的全部字段和字段值
print type(movies), len(movies), movies[0]

# 讀取一條數(shù)據(jù)的部分字段
# 返回一個(gè)字段渗饮,對(duì)應(yīng)所選擇的部分字段和字段值
cursor.execute("select id, title, url from movie")
movie = cursor.fetchone()
print type(movie), len(movie), movie

# 讀取一條數(shù)據(jù)的部分字段
# 按id降序排序,默認(rèn)為升序
cursor.execute("select id, title, url from movie order by id desc")
movie = cursor.fetchone()
print type(movie), len(movie), movie

最后是從數(shù)據(jù)庫(kù)中刪除數(shù)據(jù)私蕾,刪除數(shù)據(jù)是不可恢復(fù)的胡桃,所以務(wù)必需要謹(jǐn)慎操作,并一定要提供刪除條件容贝,這樣僅滿足刪除條件的記錄才會(huì)被刪除之景。

# 刪除數(shù)據(jù)務(wù)必要提供刪除條件
# 此處刪除id為1的記錄
cursor.execute("delete from movie where id=%s", [1])

關(guān)閉連接

使用Python操作完數(shù)據(jù)庫(kù)之后,別忘記了關(guān)閉數(shù)據(jù)庫(kù)連接锻狗。

# 關(guān)閉數(shù)據(jù)庫(kù)連接
cursor.close()
db.close()

擴(kuò)展內(nèi)容

我們會(huì)發(fā)現(xiàn)在使用Python操作數(shù)據(jù)庫(kù)時(shí)轻纪,主要是使用execute()函數(shù)并傳入SQL命令。以上介紹的都是最基礎(chǔ)的CURD操作刻帚,其實(shí)SQL命令可以融合非常多的功能并寫(xiě)得更為復(fù)雜。

以下鏈接提供了一份更加完整的SQL教程掂僵,http://www.runoob.com/sql/sql-tutorial.html顷歌,系統(tǒng)地講解了SQL中的其他常用高級(jí)語(yǔ)法。強(qiáng)烈推薦學(xué)習(xí)一遍互妓,這樣才能在用Python操作數(shù)據(jù)庫(kù)時(shí),得心應(yīng)手地寫(xiě)出滿足需求的SQL命令來(lái)冯勉。

視頻鏈接:用Python操作MySQL

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末灼狰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子交胚,更是在濱河造成了極大的恐慌,老刑警劉巖杯活,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熬词,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡歪今,警方通過(guò)查閱死者的電腦和手機(jī)颜矿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)骑疆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人封断,你說(shuō)我怎么就攤上這事舶担。” “怎么了柄瑰?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵剪况,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我授翻,道長(zhǎng),這世上最難降的妖魔是什么堪唐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任淮菠,我火速辦了婚禮,結(jié)果婚禮上合陵,老公的妹妹穿的比我還像新娘。我一直安慰自己踏拜,他們只是感情好举庶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布户侥。 她就那樣靜靜地躺著,像睡著了一般蕊唐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钓试,一...
    開(kāi)封第一講書(shū)人閱讀 51,231評(píng)論 1 299
  • 那天副瀑,我揣著相機(jī)與錄音,去河邊找鬼挽鞠。 笑死狈孔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的均抽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼潦蝇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了华烟?” 一聲冷哼從身側(cè)響起持灰,我...
    開(kāi)封第一講書(shū)人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎喂链,沒(méi)想到半個(gè)月后妥泉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蝇率,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年刽沾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锅尘。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡布蔗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出顿乒,到底是詐尸還是另有隱情泽谨,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布犹菱,位于F島的核電站吮炕,受9級(jí)特大地震影響访得,放射性物質(zhì)發(fā)生泄漏陕凹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一杜耙、第九天 我趴在偏房一處隱蔽的房頂上張望拂盯。 院中可真熱鬧,春花似錦团驱、人聲如沸空凸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)道逗。三九已至,卻和暖如春憔辫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坏平。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工锦亦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人顾瞪。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓抛蚁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親钉跷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容