python 數(shù)據(jù)庫編程,這篇是針對 mysql 的骤星,滾雪球?qū)WPython第4季第13篇

在第一季滾雪球?qū)W python 中经瓷,我們已經(jīng)接觸了 python 操作 sqlite,本篇博客為你介紹 python 與 mysql 和 nosql 之間的故事洞难。

在正式學(xué)習(xí)之前舆吮,先確保你電腦上已經(jīng)安裝了 mysql 。

mysql 的安裝博客:補充知識:2021 年 mysql 最新 windows 安裝教程,滾雪球?qū)W python 第四季色冀。

mysql 一些簡單命令

對于 mysql 的細致學(xué)習(xí)潭袱,咱們應(yīng)該單獨開一個系列,這個 flag 先立下了锋恬,本文為了學(xué)習(xí) python 操作 mysql 數(shù)據(jù)庫敌卓,只能先做一些基本鋪墊。

查看所有數(shù)據(jù)庫

show databases;

查看幫助

help

退出 mysql

exit

創(chuàng)建數(shù)據(jù)庫

create database cadb;

刪除數(shù)據(jù)庫

drop database cadb;

使用某個數(shù)據(jù)庫

use cadb;

查看庫表

show tables;

查看表結(jié)構(gòu)

desc 表名;

除了上述內(nèi)容外伶氢,你還要學(xué)習(xí)建表語句,刪表語句瘪吏,表中插入數(shù)據(jù)語句癣防,表刪除數(shù)據(jù)語句,表更新數(shù)據(jù)語句掌眠,這些稍后在 python 操作 mysql 中進行實現(xiàn)蕾盯。

python 操作 mysql

操作數(shù)據(jù)庫一般被程序員成為 CRUD 操作(增刪改查),其中各個字符分別代表 C(Create) 新增蓝丙,R(Read) 讀取级遭,U(Update) 更新,D(Delete) 刪除渺尘。

在 python3 中推薦使用 pymysql 模塊操作數(shù)據(jù)庫挫鸽,模塊使用命令 pip install PyMySQL 進行安裝。

在此之前鸥跟,先通過 MySQL Command Line Client 創(chuàng)建一個表用來做測試丢郊。

新建庫,新建表医咨,插入數(shù)據(jù) 命令依次如下

show databases;
create database cadb;
use cadb;
-- 建表語句
create table user(name varchar(10),uid int,primary key(uid));

desc user;

接下來在表中插入 2 條數(shù)據(jù)枫匾。

insert into user(name,uid) values ("橡皮擦",1);
insert into user(name,uid) values ("CSDN",2);

簡單的查詢 sql 如下所示:

select * from user;

下面就可以在 python 中編寫操作該庫表的相關(guān)代碼了,數(shù)據(jù)庫鏈接步驟如下:

  1. 連接數(shù)據(jù)庫拟淮,生成連接對象干茉;
  2. 創(chuàng)建游標對象,用于訪問數(shù)據(jù)表很泊;
  3. 執(zhí)行 sql 語句角虫;
  4. 關(guān)閉游標;
  5. 關(guān)閉連接委造。

python 查詢數(shù)據(jù)
python 連接數(shù)據(jù)庫獲取數(shù)據(jù)

import pymysql

# python 連接數(shù)據(jù)庫上遥,返回數(shù)據(jù)庫連接對象
conn = pymysql.connect(host="127.0.0.1", user="root", password="xiangpica", database="cadb", charset="utf8")
print(conn)

輸出連接對象如下所示:

<pymysql.connections.Connection object at 0x00000000021E2F60>

其中 connect 方法相關(guān)的參數(shù)可以依據(jù)名稱進行判斷。

接下來就是創(chuàng)建游標争涌,提取數(shù)據(jù)粉楚。

# 通過 cursor() 創(chuàng)建游標對象,并讓查詢結(jié)果以字典格式輸出
cur = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 輸出 <pymysql.cursors.DictCursor object at 0x0000000002C03B00>

下一步使用游標對象 curexecute 方法執(zhí)行 sql

cur.execute("select * from user")

最后通過相關(guān)方法獲取查詢結(jié)果模软,本案例獲取所有用戶使用 fetchall 方法伟骨。

# 獲取查詢結(jié)果
data = cur.fetchall()

輸入數(shù)據(jù)庫檢索的所有數(shù)據(jù)。

[{'name': '橡皮擦', 'uid': 1}, {'name': 'CSDN', 'uid': 2}]

關(guān)閉游標燃异,關(guān)閉連接

# 關(guān)閉游標
cur.close()
# 關(guān)閉數(shù)據(jù)庫連接
conn.close()

接下來我們將其修改的復(fù)雜一些携狭,檢索特定數(shù)據(jù),例如 uid=1 的數(shù)據(jù)回俐,并且用到上下文管理器 with 進行對象的關(guān)閉逛腿。

第一種寫法

import pymysql

# python 連接數(shù)據(jù)庫,返回數(shù)據(jù)庫連接對象
conn = pymysql.connect(host="127.0.0.1", user="root", password="xiangpica", database="cadb", charset="utf8")
# print(conn)
with conn.cursor(cursor=pymysql.cursors.DictCursor) as cur:
    cur.execute("select * from user where uid = %s", 1)
    # 獲取查詢結(jié)果
    data = cur.fetchall()
    print(data)

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

第二種寫法

import pymysql

# python 連接數(shù)據(jù)庫仅颇,返回數(shù)據(jù)庫連接對象
conn = pymysql.connect(host="127.0.0.1", user="root", password="xiangpica", database="cadb", charset="utf8")
# print(conn)
with conn.cursor(cursor=pymysql.cursors.DictCursor) as cur:
    cur.execute("select * from user where uid = %(uid)s", {"uid": 1})
    # 獲取查詢結(jié)果
    data = cur.fetchall()
    print(data)

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

兩種寫法单默,在 execute 方法參數(shù)存在差異,可直接對比學(xué)習(xí)忘瓦。

python 更新數(shù)據(jù)表數(shù)據(jù)
接下來演示的是使用 python 去更新表數(shù)據(jù)搁廓,例如將 uid = 2name 列更新為 Code

import pymysql

# python 連接數(shù)據(jù)庫耕皮,返回數(shù)據(jù)庫連接對象
conn = pymysql.connect(host="127.0.0.1", user="root", password="xiangpica", database="cadb", charset="utf8")
# print(conn)
with conn.cursor(cursor=pymysql.cursors.DictCursor) as cur:
    try:
        cur.execute("update user set name =%s where uid = %s", ["Code", 2])

        conn.commit()  # 提交事務(wù)
    except Exception as e:
        print("數(shù)據(jù)更新異常", e)
        conn.rollback()  # 數(shù)據(jù)回滾

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

上述代碼核心為在執(zhí)行 SQL 操作之后境蜕,需要使用事務(wù)處理,即 conn.commit 提交事務(wù)凌停,確保當前修改生效粱年,如果出現(xiàn)異常,還需要使用 conn.rollback 對提交事務(wù)進行回滾罚拟。

cursor. execute 可以返回受影響行數(shù)逼泣,可以直接通過該值判斷是否修改成功。

本次代碼還使用了 try-except 語句舟舒,對于 PyMySQL 模塊內(nèi)置的異常類拉庶,清單如下:

  • StandardError
    • Warning
    • Error
      • InterfaceError
      • DatabaseError
        • DataError
        • OperationalError
        • IntegrityError
        • ProgrammingError
        • NotSupportedError

python 新增數(shù)據(jù)表數(shù)據(jù)
接下來演示增加數(shù)據(jù),本次插入數(shù)據(jù)都采用硬編碼秃励,如果想創(chuàng)建一個自動遞增的表字段氏仗,需要繼續(xù)研究 sql 相關(guān)寫法。

import pymysql

# python 連接數(shù)據(jù)庫夺鲜,返回數(shù)據(jù)庫連接對象
conn = pymysql.connect(host="127.0.0.1", user="root", password="xiangpica", database="cadb", charset="utf8")
# print(conn)
with conn.cursor(cursor=pymysql.cursors.DictCursor) as cur:
    try:
        affected = cur.execute("insert into user(name,uid) values (%s,%s)", ["Good", 3])

        conn.commit()  # 提交事務(wù)
        print("受影響行數(shù)", affected)
    except Exception as e:
        print("數(shù)據(jù)插入異常", e)
        conn.rollback()  # 數(shù)據(jù)回滾

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

python 刪除表格數(shù)據(jù)
核心代碼如下所示:

affected = cur.execute("delete from user where uid = %s", [3])
conn.commit()  # 提交事務(wù)
print("受影響行數(shù)", affected)

寫到這里皆尔,你可以自行完成一個 python 簡單的數(shù)據(jù)庫操作封裝。

python 操作 nosql 之 dbm

mysql 數(shù)據(jù)關(guān)系型數(shù)據(jù)庫币励,與之對應(yīng)的就是非關(guān)系型數(shù)據(jù)庫慷蠕,例如 python 內(nèi)置的 dbm(database manager )

第一個要學(xué)習(xí)的方法是 dbm.open,方法原型如下所示:

def open(file, flag='r', mode=0o666):

flag 參數(shù):

  • r : 只讀食呻;
  • w : 只寫流炕;
  • n : 總是創(chuàng)建一個數(shù)據(jù)庫澎现,打開方式為讀寫;
  • c : 存在不創(chuàng)建每辟,不存在則創(chuàng)建剑辫。

關(guān)閉數(shù)據(jù)庫使用 dbm.close(),使用 with 語句之后渠欺,不需要手動釋放資源妹蔽。

with dbm.open(xxx) as db:
    pass

dbm 存儲的形式類似 python 字典,以鍵值對形式存在挠将。

import dbm

with dbm.open('example.db', 'n') as db:
    db['name'] = '橡皮擦' # 存儲值
    db['age'] = '18' # values must be bytes or strings

讀取值使用 db[key] 即可胳岂,如果沒有 key 值,提示 KeyError 錯誤舔稀。

import dbm

with dbm.open('example.db', 'r') as db:
    ca = db["name"]
    age = db["age"]
    print(ca)

dbm 數(shù)據(jù)庫保存的數(shù)據(jù)是字符串類型或者字節(jié)序列類型乳丰,讀取到的值是字節(jié)序列類型,需要使用解碼函數(shù) decode 轉(zhuǎn)換成字符串镶蹋。

更多精彩

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市赏半,隨后出現(xiàn)的幾起案子贺归,更是在濱河造成了極大的恐慌,老刑警劉巖断箫,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拂酣,死亡現(xiàn)場離奇詭異,居然都是意外死亡仲义,警方通過查閱死者的電腦和手機婶熬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來埃撵,“玉大人赵颅,你說我怎么就攤上這事≡萘酰” “怎么了饺谬?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谣拣。 經(jīng)常有香客問我募寨,道長,這世上最難降的妖魔是什么森缠? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任拔鹰,我火速辦了婚禮,結(jié)果婚禮上贵涵,老公的妹妹穿的比我還像新娘列肢。我一直安慰自己恰画,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布例书。 她就那樣靜靜地躺著锣尉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪决采。 梳的紋絲不亂的頭發(fā)上自沧,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音树瞭,去河邊找鬼拇厢。 笑死,一個胖子當著我的面吹牛晒喷,可吹牛的內(nèi)容都是我干的孝偎。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼凉敲,長吁一口氣:“原來是場噩夢啊……” “哼衣盾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起爷抓,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤势决,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蓝撇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體果复,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年渤昌,在試婚紗的時候發(fā)現(xiàn)自己被綠了虽抄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡独柑,死狀恐怖迈窟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情忌栅,我是刑警寧澤菠隆,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站狂秘,受9級特大地震影響骇径,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜者春,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一破衔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钱烟,春花似錦晰筛、人聲如沸嫡丙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽曙博。三九已至,卻和暖如春怜瞒,著一層夾襖步出監(jiān)牢的瞬間父泳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工吴汪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惠窄,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓漾橙,卻偏偏與公主長得像杆融,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子霜运,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

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