在第一季滾雪球?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ù)庫鏈接步驟如下:
- 連接數(shù)據(jù)庫拟淮,生成連接對象干茉;
- 創(chuàng)建游標對象,用于訪問數(shù)據(jù)表很泊;
- 執(zhí)行 sql 語句角虫;
- 關(guān)閉游標;
- 關(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>
下一步使用游標對象 cur
的 execute
方法執(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 = 2
的 name
列更新為 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)換成字符串镶蹋。
更多精彩