Python 3 教程
MySQL 是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),如果你不熟悉 MySQL,可以閱讀我們的 MySQL 教程。
本章節(jié)我們?yōu)榇蠹医榻B使用 mysql-connector 來(lái)連接使用 MySQL, mysql-connector 是 MySQL 官方提供的驅(qū)動(dòng)器。
我們可以使用 pip 命令來(lái)安裝 mysql-connector:
python -m pip install mysql-connector
使用以下代碼測(cè)試 mysql-connector 是否安裝成功:
執(zhí)行以上代碼,如果沒(méi)有產(chǎn)生錯(cuò)誤,表明安裝成功。
注意:如果你的 MySQL 是 8.0 版本,密碼插件驗(yàn)證方式發(fā)生了變化,早期版本為 mysql_native_password,8.0 版本為 caching_sha2_password,所以需要做些改變:
先修改 my.ini 配置:
[mysqld] default_authentication_plugin=mysql_native_password然后在 mysql 下執(zhí)行以下命令來(lái)修改密碼:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密碼';更多內(nèi)容可以參考:Python MySQL8.0 鏈接問(wèn)題。
可以使用以下代碼來(lái)連接數(shù)據(jù)庫(kù):
創(chuàng)建數(shù)據(jù)庫(kù)使用 "CREATE DATABASE" 語(yǔ)句,以下創(chuàng)建一個(gè)名為 json_db 的數(shù)據(jù)庫(kù):
創(chuàng)建數(shù)據(jù)庫(kù)前我們也可以使用 "SHOW DATABASES" 語(yǔ)句來(lái)查看數(shù)據(jù)庫(kù)是否存在:
輸出所有數(shù)據(jù)庫(kù)列表:
或者我們可以直接連接數(shù)據(jù)庫(kù),如果數(shù)據(jù)庫(kù)不存在,會(huì)輸出錯(cuò)誤信息:
創(chuàng)建數(shù)據(jù)表使用 "CREATE TABLE" 語(yǔ)句,創(chuàng)建數(shù)據(jù)表前,需要確保數(shù)據(jù)庫(kù)已存在,以下創(chuàng)建一個(gè)名為 sites 的數(shù)據(jù)表:
創(chuàng)建表的時(shí)候我們一般都會(huì)設(shè)置一個(gè)主鍵(PRIMARY KEY),我們可以使用 "INT AUTO_INCREMENT PRIMARY KEY" 語(yǔ)句來(lái)創(chuàng)建一個(gè)主鍵,主鍵起始值為 1,逐步遞增。
如果我們的表已經(jīng)創(chuàng)建,我們需要使用 ALTER TABLE 來(lái)給表添加主鍵:
給 sites 表添加主鍵。
如果你還未創(chuàng)建 sites 表,可以直接使用以下代碼創(chuàng)建。
給表創(chuàng)建主鍵。
插入數(shù)據(jù)使用 "INSERT INTO" 語(yǔ)句:
向 sites 表插入一條記錄。
執(zhí)行代碼,輸出結(jié)果為:
1 記錄插入成功
批量插入使用 executemany() 方法,該方法的第二個(gè)參數(shù)是一個(gè)元組列表,包含了我們要插入的數(shù)據(jù):
向 sites 表插入多條記錄。
執(zhí)行代碼,輸出結(jié)果為:
4 記錄插入成功。
執(zhí)行以上代碼后,我們可以看看數(shù)據(jù)表的記錄.
如果我們想在數(shù)據(jù)記錄插入后,獲取該記錄的 ID ,可以使用以下代碼:
執(zhí)行代碼,輸出結(jié)果為:
1 條記錄已插入, ID: 6
查詢(xún)數(shù)據(jù)使用 SELECT 語(yǔ)句:
執(zhí)行代碼,輸出結(jié)果為:
(1, 'JSON', '') (2, 'Google', 'https://www.google.com') (3, 'Github', 'https://www.github.com') (4, 'Taobao', 'https://www.taobao.com') (5, 'stackoverflow', 'https://www.stackoverflow.com/') (6, 'Zhihu', 'https://www.zhihu.com')
也可以讀取指定的字段數(shù)據(jù):
執(zhí)行代碼,輸出結(jié)果為:
('JSON', '') ('Google', 'https://www.google.com') ('Github', 'https://www.github.com') ('Taobao', 'https://www.taobao.com') ('stackoverflow', 'https://www.stackoverflow.com/') ('Zhihu', 'https://www.zhihu.com')
如果我們只想讀取一條數(shù)據(jù),可以使用 fetchone() 方法:
執(zhí)行代碼,輸出結(jié)果為:
(1, 'JSON', '')
如果我們要讀取指定條件的數(shù)據(jù),可以使用 where 語(yǔ)句:
讀取 name 字段為 JSON 的記錄:
執(zhí)行代碼,輸出結(jié)果為:
(1, 'JSON', '')
也可以使用通配符 %:
執(zhí)行代碼,輸出結(jié)果為:
(1, 'JSON', '') (2, 'Google', 'https://www.google.com')
為了防止數(shù)據(jù)庫(kù)查詢(xún)發(fā)生 SQL 注入的攻擊,我們可以使用 %s 占位符來(lái)轉(zhuǎn)義查詢(xún)的條件:
查詢(xún)結(jié)果排序可以使用 ORDER BY 語(yǔ)句,默認(rèn)的排序方式為升序,關(guān)鍵字為 ASC,如果要設(shè)置降序排序,可以設(shè)置關(guān)鍵字 DESC。
按 name 字段字母的升序排序:
執(zhí)行代碼,輸出結(jié)果為:
(3, 'Github', 'https://www.github.com') (2, 'Google', 'https://www.google.com') (1, 'JSON', '') (5, 'stackoverflow', 'https://www.stackoverflow.com/') (4, 'Taobao', 'https://www.taobao.com') (6, 'Zhihu', 'https://www.zhihu.com')
降序排序?qū)嵗?/p>
按 name 字段字母的降序排序:
執(zhí)行代碼,輸出結(jié)果為:
(6, 'Zhihu', 'https://www.zhihu.com') (4, 'Taobao', 'https://www.taobao.com') (5, 'stackoverflow', 'https://www.stackoverflow.com/') (1, 'JSON', '') (2, 'Google', 'https://www.google.com') (3, 'Github', 'https://www.github.com')
如果我們要設(shè)置查詢(xún)的數(shù)據(jù)量,可以通過(guò) "LIMIT" 語(yǔ)句來(lái)指定
讀取前 3 條記錄:
執(zhí)行代碼,輸出結(jié)果為:
(1, 'JSON', '') (2, 'Google', 'https://www.google.com') (3, 'Github', 'https://www.github.com')
也可以指定起始位置,使用的關(guān)鍵字是 OFFSET:
從第二條開(kāi)始讀取前 3 條記錄:
執(zhí)行代碼,輸出結(jié)果為:
(2, 'Google', 'https://www.google.com') (3, 'Github', 'https://www.github.com') (4, 'Taobao', 'https://www.taobao.com')
刪除記錄使用 "DELETE FROM" 語(yǔ)句:
刪除 name 為 stackoverflow 的記錄:
執(zhí)行代碼,輸出結(jié)果為:
1 條記錄刪除
注意:要慎重使用刪除語(yǔ)句,刪除語(yǔ)句要確保指定了 WHERE 條件語(yǔ)句,否則會(huì)導(dǎo)致整表數(shù)據(jù)被刪除。
為了防止數(shù)據(jù)庫(kù)查詢(xún)發(fā)生 SQL 注入的攻擊,我們可以使用 %s 占位符來(lái)轉(zhuǎn)義刪除語(yǔ)句的條件:
執(zhí)行代碼,輸出結(jié)果為:
1 條記錄刪除
數(shù)據(jù)表更新使用 "UPDATE" 語(yǔ)句:
將 name 為 Zhihu 的字段數(shù)據(jù)改為 ZH:
執(zhí)行代碼,輸出結(jié)果為:
1 條記錄被修改
注意:UPDATE 語(yǔ)句要確保指定了 WHERE 條件語(yǔ)句,否則會(huì)導(dǎo)致整表數(shù)據(jù)被更新。
為了防止數(shù)據(jù)庫(kù)查詢(xún)發(fā)生 SQL 注入的攻擊,我們可以使用 %s 占位符來(lái)轉(zhuǎn)義更新語(yǔ)句的條件:
執(zhí)行代碼,輸出結(jié)果為:
1 條記錄被修改
刪除表使用 "DROP TABLE" 語(yǔ)句, IF EXISTS 關(guān)鍵字是用于判斷表是否存在,只有在存在的情況才刪除: