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

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

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

MySQLdb

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

pip install mysql-python

如果可以在Python中import成功,則表示安裝沒有問題,否則還得繼續(xù)折騰。不過安裝和配置等事情畢竟是一勞永逸的,糾結(jié)一次,受益終身,絕知此事須躬行。

import MySQLdb

建立連接

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

import MySQLdb
import MySQLdb.cursors

打開MAMP或者WAMP并啟動Web服務(wù),使得MySQL運行起來,可以通過訪問phpMyAdmin管理頁面以確認MySQL成功運行。然后,使用以下代碼即可建立MySQL數(shù)據(jù)庫連接,其中host為數(shù)據(jù)庫的主機地址,可以使用127.0.0.1localhost表示本機,user和passwd分別為數(shù)據(jù)庫的用戶名和密碼,db表示接下來要操作的數(shù)據(jù)庫,port和charset表示連接的端口和字符集。以上參數(shù)分別替換成實際值即可,這里我們使用之前在本機數(shù)據(jù)庫中新建的douban數(shù)據(jù)庫,得到的cursor變量可用于執(zhí)行后續(xù)數(shù)據(jù)庫操作。如果需要連接云端服務(wù)器的數(shù)據(jù)庫,使用相應(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ù)庫相關(guān)的操作無非CURD四種,即Create、Update、Read、Delete。要用到的數(shù)據(jù)可以在我的Github上找到,里面的data文件夾中除了上次的西游記小說,還包括這次要用到的douban_movie_clean.txt,其中包含一行表頭,之后每一行都是一條電影數(shù)據(jù),包括id、title、url、cover、rate等15個字段,字段之間以^分割,主要是避免中文內(nèi)容里包括逗號導(dǎo)致沖突。

首先來看下如何向數(shù)據(jù)表中插入數(shù)據(jù),以下代碼讀取douban_movie_clean.txt中的數(shù)據(jù)并逐條插入數(shù)據(jù)表中。需要注意的是,數(shù)據(jù)表的結(jié)構(gòu)應(yīng)當和需要插入的字段保持一致,即movie表應(yīng)當中包含主鍵id、標題title、鏈接url、評分rate、時長length、簡介description六個字段。

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

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

    # strip()函數(shù)可以去掉字符串兩端的空白符
    # split()函數(shù)按照給定的分割符將字符串分割為列表
    line = line.strip().split('^')
    # 插入數(shù)據(jù),注意對齊字段
    # execute()函數(shù)第一個參數(shù)為要執(zhí)行的SQL命令
    # 這里用字符串格式化的方法生成一個模板
    # %s表示一個占位符
    # 第二個參數(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()

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

接下來再了解下如何更新數(shù)據(jù)庫中的數(shù)據(jù)。SQL命令可以根據(jù)給定的條件,更新滿足條件的記錄,例如改變記錄中的某些字段。既然每條數(shù)據(jù)都有唯一的主鍵id,不妨將id作為條件進行更新。當然也可以做一些更有意義的更新,例如添加一個“電影時長分類”字段,然后對于每條記錄,如果時長大于100,則“電影時長分類”更新為“長電影”,否則更新為“短電影”。

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

運行以上代碼之后,在phpMyAdmin中Browse標簽頁下即可看到,id為1的記錄相應(yīng)字段確實已經(jīng)得到了更新。

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

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

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

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

最后是從數(shù)據(jù)庫中刪除數(shù)據(jù),刪除數(shù)據(jù)是不可恢復(fù)的,所以務(wù)必需要謹慎操作,并一定要提供刪除條件,這樣僅滿足刪除條件的記錄才會被刪除。

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

關(guān)閉連接

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

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

擴展內(nèi)容

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

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

視頻鏈接:用Python操作MySQL

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容