Python操作MySQL數(shù)據(jù)庫(kù)實(shí)踐
本文系統(tǒng)梳理 Python 操作 MySQL 數(shù)據(jù)庫(kù)的全流程技術(shù)棧,從基礎(chǔ)的 PyMySQL 連接庫(kù)安裝、數(shù)據(jù)庫(kù)連接與增刪改查操作,到進(jìn)階的連接池優(yōu)化、事務(wù)管理與隔離級(jí)別深度解析,同時(shí)補(bǔ)充了圖片未覆蓋的異常處理、SQL 注入防護(hù)、批量操作優(yōu)化、上下文管理器等實(shí)用知識(shí)點(diǎn)。
全文以運(yùn)維開發(fā)視角,結(jié)合實(shí)戰(zhàn)代碼與原理說(shuō)明,幫助讀者掌握 Python 操作 MySQL 的核心技能,解決高并發(fā)場(chǎng)景下的性能瓶頸與數(shù)據(jù)一致性問題,適合運(yùn)維工程師、后端開發(fā)及數(shù)據(jù)庫(kù)學(xué)習(xí)者參考學(xué)習(xí)。
一、前言
在現(xiàn)代應(yīng)用程序與運(yùn)維自動(dòng)化開發(fā)中,數(shù)據(jù)庫(kù)操作是核心環(huán)節(jié)之一。
MySQL 作為最流行的開源關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS),廣泛應(yīng)用于中小規(guī)模業(yè)務(wù)系統(tǒng)、運(yùn)維監(jiān)控平臺(tái)、數(shù)據(jù)采集工具等場(chǎng)景。
Python 憑借簡(jiǎn)潔的語(yǔ)法和豐富的生態(tài),成為操作 MySQL 的首選語(yǔ)言之一:我們可以通過連接庫(kù)與 MySQL 數(shù)據(jù)庫(kù)交互,實(shí)現(xiàn)數(shù)據(jù)的增、刪、改、查,同時(shí)通過連接池、事務(wù)管理等技術(shù)優(yōu)化性能、保障數(shù)據(jù)一致性。
二、Python MySQL 連接庫(kù)的選擇與安裝
2.1 主流連接庫(kù)對(duì)比
Python 操作 MySQL 有多個(gè)成熟的連接庫(kù),不同庫(kù)的適用場(chǎng)景和特性各有差異:
| 連接庫(kù) | 特點(diǎn) | 適用場(chǎng)景 |
|---|---|---|
| mysql-connector-python | MySQL 官方推薦庫(kù),純 Python 實(shí)現(xiàn),無(wú)需依賴 C 編譯器,兼容性強(qiáng) | 跨平臺(tái)部署、無(wú)編譯環(huán)境的場(chǎng)景 |
| PyMySQL | 純 Python 實(shí)現(xiàn),兼容 MySQLdb 接口,輕量易用,社區(qū)活躍 | 主流 Python 項(xiàng)目、運(yùn)維自動(dòng)化腳本 |
| mysqlclient | 基于 C 語(yǔ)言實(shí)現(xiàn),性能更高,兼容 Django 等框架 | 高并發(fā)、高性能要求的后端項(xiàng)目 |
圖片中重點(diǎn)介紹了mysql-connector-python和PyMySQL,其中PyMySQL是目前 Python 生態(tài)中最常用的選擇,本文后續(xù)示例均以 PyMySQL 為例。
2.2 安裝命令
(1)安裝 mysql-connector-python
運(yùn)行
pip install mysql-connector-python
(2)安裝 PyMySQL(推薦)
運(yùn)行
pip install pymysql
(3)補(bǔ)充:安裝高性能 mysqlclient
運(yùn)行
# Windows pip install mysqlclient # Linux (Ubuntu/Debian) sudo apt-get install python3-dev default-libmysqlclient-dev build-essential pip install mysqlclient # CentOS/RHEL sudo yum install python3-devel mysql-devel pip install mysqlclient
三、Python 連接 MySQL 數(shù)據(jù)庫(kù)的完整流程
3.1 基礎(chǔ)連接步驟
(1)導(dǎo)入連接庫(kù)
運(yùn)行
import pymysql
(2)創(chuàng)建數(shù)據(jù)庫(kù)連接
使用pymysql.connect()方法建立連接,核心參數(shù)說(shuō)明:
host:MySQL 服務(wù)器地址,本地為localhost,遠(yuǎn)程為 IP 地址user:數(shù)據(jù)庫(kù)用戶名,通常為rootpassword:數(shù)據(jù)庫(kù)密碼database:要連接的數(shù)據(jù)庫(kù)名稱port:MySQL 端口,默認(rèn) 3306(可省略)charset:字符集,推薦utf8mb4(支持 emoji 等特殊字符)connect_timeout:連接超時(shí)時(shí)間(秒),避免長(zhǎng)時(shí)間等待
完整示例:
運(yùn)行
# 建立數(shù)據(jù)庫(kù)連接
db = pymysql.connect(
host="localhost",
user="root",
password="your_password",
database="testdb",
port=3306,
charset="utf8mb4",
connect_timeout=10
)
(3)創(chuàng)建游標(biāo)對(duì)象
游標(biāo)是執(zhí)行 SQL 語(yǔ)句的核心對(duì)象,用于發(fā)送 SQL 命令、接收?qǐng)?zhí)行結(jié)果:
運(yùn)行
cursor = db.cursor()
補(bǔ)充知識(shí)點(diǎn):游標(biāo)類型
- 默認(rèn)游標(biāo):返回元組格式的結(jié)果
DictCursor:返回字典格式的結(jié)果,鍵為列名,更便于數(shù)據(jù)處理
運(yùn)行
from pymysql.cursors import DictCursor cursor = db.cursor(cursor=DictCursor)
(4)執(zhí)行 SQL 語(yǔ)句
通過游標(biāo)execute()方法執(zhí)行 SQL,支持%s占位符防 SQL 注入:
運(yùn)行
# 查詢示例
cursor.execute("SELECT * FROM users")
(5)獲取查詢結(jié)果
fetchall():獲取所有查詢結(jié)果,返回二維元組 / 列表fetchone():獲取單條查詢結(jié)果,返回一維元組 / 字典fetchmany(size):獲取指定數(shù)量的結(jié)果
示例:
運(yùn)行
# 獲取所有結(jié)果
results = cursor.fetchall()
for row in results:
print(row)
# 獲取單條結(jié)果
one_row = cursor.fetchone()
print(one_row)
(6)關(guān)閉連接
操作完成后必須關(guān)閉游標(biāo)和連接,避免資源泄漏:
運(yùn)行
cursor.close() db.close()
3.2 補(bǔ)充:上下文管理器優(yōu)化連接
使用with語(yǔ)句自動(dòng)管理連接和游標(biāo),無(wú)需手動(dòng)關(guān)閉,避免資源泄漏:
運(yùn)行
# 連接上下文管理器
with pymysql.connect(
host="localhost",
user="root",
password="your_password",
database="testdb",
charset="utf8mb4"
) as db:
# 游標(biāo)上下文管理器
with db.cursor() as cursor:
cursor.execute("SELECT * FROM users")
results = cursor.fetchall()
for row in results:
print(row)
# 自動(dòng)關(guān)閉連接和游標(biāo)
四、MySQL 常見 CRUD 操作詳解
4.1 插入數(shù)據(jù)(INSERT)
使用INSERT INTO語(yǔ)句,通過%s占位符防 SQL 注入,執(zhí)行后需提交事務(wù):
運(yùn)行
# 單條插入
sql = "INSERT INTO users (name, age) VALUES (%s, %s)"
cursor.execute(sql, ("Alice", 25))
db.commit() # 提交事務(wù),保存數(shù)據(jù)
# 批量插入(executemany)
sql = "INSERT INTO users (name, age) VALUES (%s, %s)"
data = [("Bob", 30), ("Charlie", 35), ("David", 28)]
cursor.executemany(sql, data)
db.commit()
補(bǔ)充知識(shí)點(diǎn):批量插入優(yōu)化
executemany()比多次execute()性能提升 10-100 倍,適合批量數(shù)據(jù)導(dǎo)入- 可通過
cursor.lastrowid獲取自增主鍵 ID:print(cursor.lastrowid)
4.2 更新數(shù)據(jù)(UPDATE)
使用UPDATE語(yǔ)句,必須加WHERE條件,避免全表更新:
運(yùn)行
sql = "UPDATE users SET age = %s WHERE name = %s" cursor.execute(sql, (26, "Alice")) db.commit()
4.3 刪除數(shù)據(jù)(DELETE)
使用DELETE語(yǔ)句,必須加WHERE條件,避免誤刪全表數(shù)據(jù):
運(yùn)行
sql = "DELETE FROM users WHERE name = %s"
cursor.execute(sql, ("Alice",)) # 注意逗號(hào),確保是元組
db.commit()
4.4 查詢數(shù)據(jù)(SELECT)
基礎(chǔ)查詢、條件查詢、模糊查詢、聯(lián)合查詢:
(1)基礎(chǔ)查詢
運(yùn)行
cursor.execute("SELECT * FROM users")
results = cursor.fetchall()
(2)條件查詢
運(yùn)行
sql = "SELECT * FROM users WHERE age > %s" cursor.execute(sql, (25,)) results = cursor.fetchall()
(3)模糊查詢(LIKE)
運(yùn)行
# 查詢名字包含"a"的用戶
sql = "SELECT * FROM users WHERE name LIKE %s"
cursor.execute(sql, ("%a%",))
results = cursor.fetchall()
(4)聯(lián)合查詢(JOIN)
多表關(guān)聯(lián)查詢,常用INNER JOIN、LEFT JOIN:
運(yùn)行
sql = """ SELECT users.name, orders.amount FROM users INNER JOIN orders ON users.id = orders.user_id """ cursor.execute(sql) results = cursor.fetchall()
4.5 補(bǔ)充:SQL 注入防護(hù)
- 核心原則:永遠(yuǎn)不要用字符串拼接 SQL 語(yǔ)句,必須使用
%s占位符
錯(cuò)誤示例(存在注入風(fēng)險(xiǎn)):
運(yùn)行
# 危險(xiǎn)!用戶輸入惡意內(nèi)容會(huì)導(dǎo)致SQL注入
sql = f"SELECT * FROM users WHERE name = '{user_input}'"
正確示例(占位符防注入):
運(yùn)行
sql = "SELECT * FROM users WHERE name = %s" cursor.execute(sql, (user_input,))
- 補(bǔ)充防護(hù):使用預(yù)編譯語(yǔ)句、限制數(shù)據(jù)庫(kù)用戶權(quán)限、開啟防火墻等
五、連接池技術(shù):高并發(fā)場(chǎng)景的性能優(yōu)化
5.1 連接池的核心原理
直接創(chuàng)建數(shù)據(jù)庫(kù)連接存在嚴(yán)重的性能問題:每次連接都需要 TCP 三次握手、身份驗(yàn)證、資源分配,頻繁創(chuàng)建 / 銷毀會(huì)導(dǎo)致系統(tǒng)性能急劇下降。
連接池的核心思想:提前創(chuàng)建一批數(shù)據(jù)庫(kù)連接,放入連接池中,客戶端需要時(shí)從池中獲取,使用后歸還,避免重復(fù)創(chuàng)建 / 銷毀的開銷,同時(shí)限制最大連接數(shù),防止數(shù)據(jù)庫(kù)過載。
5.2 基于 DBUtils 實(shí)現(xiàn)連接池
PyMySQL 本身不支持連接池,需使用DBUtils庫(kù)實(shí)現(xiàn),安裝命令:
運(yùn)行
pip install dbutils
完整連接池實(shí)現(xiàn)代碼
運(yùn)行
from dbutils.pooled_db import PooledDB
import pymysql
# 數(shù)據(jù)庫(kù)連接配置
dbconfig = {
"host": "localhost",
"user": "root",
"password": "your_password",
"database": "testdb",
"port": 3306,
"charset": "utf8mb4"
}
# 創(chuàng)建連接池
connection_pool = PooledDB(
creator=pymysql, # 使用PyMySQL作為連接庫(kù)
maxconnections=5, # 最大連接數(shù),根據(jù)數(shù)據(jù)庫(kù)配置調(diào)整
mincached=2, # 初始化時(shí)創(chuàng)建的空閑連接數(shù)
maxcached=3, # 最大空閑連接數(shù)
maxshared=3, # 最大共享連接數(shù)
blocking=True, # 連接池滿時(shí)是否阻塞等待
setsession=[], # 會(huì)話初始化SQL
ping=1, # 自動(dòng)檢測(cè)連接有效性(1=每次獲取連接時(shí)檢測(cè))
**dbconfig
)
# 從連接池獲取連接
db_connection = connection_pool.connection()
cursor = db_connection.cursor()
# 執(zhí)行SQL操作
cursor.execute("SELECT * FROM users")
results = cursor.fetchall()
for row in results:
print(row)
# 關(guān)閉游標(biāo)和連接(連接自動(dòng)歸還到連接池)
cursor.close()
db_connection.close()
5.3 連接池的核心優(yōu)勢(shì)
- 性能提升:減少連接創(chuàng)建 / 銷毀的開銷,高并發(fā)場(chǎng)景下性能提升 5-10 倍
- 資源管理:限制最大連接數(shù),避免過多連接導(dǎo)致數(shù)據(jù)庫(kù)崩潰
- 高可用性:自動(dòng)檢測(cè)連接有效性,避免使用失效連接
- 統(tǒng)一管理:統(tǒng)一配置連接參數(shù),簡(jiǎn)化代碼維護(hù)
5.4 補(bǔ)充:連接池參數(shù)詳解
maxconnections:最大連接數(shù),建議設(shè)置為 MySQLmax_connections的 80% 以內(nèi)mincached:最小空閑連接數(shù),保證隨時(shí)有可用連接maxcached:最大空閑連接數(shù),避免空閑連接占用過多資源ping:連接有效性檢測(cè),1表示每次獲取連接時(shí)檢測(cè),防止 "僵死連接"blocking:連接池滿時(shí),True表示阻塞等待,False表示拋出異常
六、事務(wù)管理:保障數(shù)據(jù)一致性
6.1 事務(wù)的核心特性(ACID)
事務(wù)是由多個(gè) SQL 語(yǔ)句組成的工作單元,必須滿足 ACID 特性:
- 原子性(Atomicity):事務(wù)中的操作要么全部成功,要么全部失敗回滾
- 一致性(Consistency):事務(wù)執(zhí)行前后,數(shù)據(jù)庫(kù)的完整性約束不被破壞
- 隔離性(Isolation):多個(gè)并發(fā)事務(wù)之間相互隔離,互不干擾
- 持久性(Durability):事務(wù)提交后,數(shù)據(jù)永久保存到數(shù)據(jù)庫(kù),不會(huì)因系統(tǒng)故障丟失
6.2 事務(wù)的基本操作
(1)開啟事務(wù)
MySQL 默認(rèn)自動(dòng)提交事務(wù),需手動(dòng)關(guān)閉自動(dòng)提交,開啟事務(wù):
運(yùn)行
# 關(guān)閉自動(dòng)提交(開啟事務(wù)模式)
db.autocommit = False
# 或顯式開啟事務(wù)
cursor.execute("START TRANSACTION")
(2)提交事務(wù)
所有操作成功后,提交事務(wù),保存數(shù)據(jù):
運(yùn)行
db.commit()
(3)回滾事務(wù)
操作失敗時(shí),回滾事務(wù),撤銷所有修改:
運(yùn)行
db.rollback()
6.3 事務(wù)隔離級(jí)別詳解
MySQL 支持 4 種事務(wù)隔離級(jí)別,解決并發(fā)事務(wù)中的 3 類問題:
- 臟讀:事務(wù) A 讀取了事務(wù) B 未提交的數(shù)據(jù),事務(wù) B 回滾后,A 讀取的數(shù)據(jù)無(wú)效
- 不可重復(fù)讀:事務(wù) A 兩次讀取同一數(shù)據(jù),事務(wù) B 在兩次讀取之間修改并提交了數(shù)據(jù),導(dǎo)致 A 兩次讀取結(jié)果不一致
- 幻讀:事務(wù) A 兩次執(zhí)行相同的查詢,事務(wù) B 在兩次查詢之間插入 / 刪除了數(shù)據(jù),導(dǎo)致 A 兩次查詢的結(jié)果集行數(shù)不一致
4 種隔離級(jí)別對(duì)比
| 隔離級(jí)別 | 臟讀 | 不可重復(fù)讀 | 幻讀 | 性能 | 適用場(chǎng)景 |
|---|---|---|---|---|---|
| READ UNCOMMITTED(未提交讀) | 允許 | 允許 | 允許 | 最高 | 數(shù)據(jù)一致性要求極低的場(chǎng)景(幾乎不使用) |
| READ COMMITTED(提交讀) | 禁止 | 允許 | 允許 | 高 | 大多數(shù)業(yè)務(wù)場(chǎng)景(如電商普通訂單) |
| REPEATABLE READ(可重復(fù)讀,MySQL 默認(rèn)) | 禁止 | 禁止 | 允許(MySQL 通過 MVCC 解決) | 中 | 金融、財(cái)務(wù)等數(shù)據(jù)一致性要求高的場(chǎng)景 |
| SERIALIZABLE(串行化) | 禁止 | 禁止 | 禁止 | 最低 | 數(shù)據(jù)一致性要求極高的場(chǎng)景(如銀行轉(zhuǎn)賬) |
隔離級(jí)別設(shè)置方法
運(yùn)行
# 1. READ UNCOMMITTED
cursor.execute("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED")
# 2. READ COMMITTED
cursor.execute("SET TRANSACTION ISOLATION LEVEL READ COMMITTED")
# 3. REPEATABLE READ(MySQL默認(rèn))
cursor.execute("SET TRANSACTION ISOLATION LEVEL REPEATABLE READ")
# 4. SERIALIZABLE
cursor.execute("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE")
6.4 事務(wù)實(shí)戰(zhàn)案例:轉(zhuǎn)賬操作
運(yùn)行
import pymysql
# 連接數(shù)據(jù)庫(kù)
conn = pymysql.connect(
host="localhost",
user="root",
password="your_password",
database="testdb",
charset="utf8mb4"
)
cursor = conn.cursor()
# 關(guān)閉自動(dòng)提交,開啟事務(wù)
conn.autocommit = False
try:
# 1. 從賬戶A扣款100元
cursor.execute("UPDATE accounts SET balance = balance - 100 WHERE name = %s", ("Alice",))
# 2. 向賬戶B入賬100元
cursor.execute("UPDATE accounts SET balance = balance + 100 WHERE name = %s", ("Bob",))
# 提交事務(wù)
conn.commit()
print("轉(zhuǎn)賬成功")
except pymysql.MySQLError as err:
# 發(fā)生錯(cuò)誤,回滾事務(wù)
print(f"轉(zhuǎn)賬失敗: {err}")
conn.rollback()
finally:
# 關(guān)閉游標(biāo)和連接
cursor.close()
conn.close()
6.5 補(bǔ)充:事務(wù)異常處理最佳實(shí)踐
- 必須使用
try-except-finally結(jié)構(gòu),確保異常時(shí)回滾事務(wù) - 事務(wù)中避免執(zhí)行耗時(shí)操作,減少鎖等待時(shí)間
- 長(zhǎng)事務(wù)會(huì)導(dǎo)致鎖競(jìng)爭(zhēng),影響系統(tǒng)性能,盡量縮短事務(wù)執(zhí)行時(shí)間
- 可通過
SAVEPOINT設(shè)置事務(wù)回滾點(diǎn),實(shí)現(xiàn)部分回滾:
運(yùn)行
cursor.execute("SAVEPOINT point1")
# 部分操作
cursor.execute("ROLLBACK TO SAVEPOINT point1")
七、圖片未覆蓋的進(jìn)階知識(shí)點(diǎn)補(bǔ)充
7.1 異常處理與錯(cuò)誤排查
(1)常見異常類型
pymysql.MySQLError:MySQL 相關(guān)錯(cuò)誤的基類pymysql.OperationalError:連接錯(cuò)誤、權(quán)限錯(cuò)誤、超時(shí)等pymysql.ProgrammingError:SQL 語(yǔ)法錯(cuò)誤、表不存在等pymysql.IntegrityError:主鍵沖突、外鍵約束失敗等
(2)完整異常處理模板
運(yùn)行
import pymysql
from pymysql.err import MySQLError, OperationalError, ProgrammingError
try:
# 數(shù)據(jù)庫(kù)操作
conn = pymysql.connect(...)
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
conn.commit()
except OperationalError as e:
print(f"連接錯(cuò)誤: {e}")
# 重連邏輯
except ProgrammingError as e:
print(f"SQL語(yǔ)法錯(cuò)誤: {e}")
except MySQLError as e:
print(f"數(shù)據(jù)庫(kù)錯(cuò)誤: {e}")
finally:
if 'cursor' in locals():
cursor.close()
if 'conn' in locals():
conn.close()
7.2 批量操作優(yōu)化
- executemany():批量插入 / 更新,性能遠(yuǎn)高于循環(huán) execute ()
- LOAD DATA INFILE:大批量數(shù)據(jù)導(dǎo)入(百萬(wàn)級(jí)以上),性能是 executemany 的 10 倍以上
運(yùn)行
sql = """ LOAD DATA LOCAL INFILE 'data.csv' INTO TABLE users FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 ROWS """ cursor.execute(sql) conn.commit()
7.3 索引優(yōu)化與慢查詢
- 為
WHERE、JOIN、ORDER BY條件列創(chuàng)建索引,提升查詢性能 - 使用
EXPLAIN分析 SQL 執(zhí)行計(jì)劃,優(yōu)化慢查詢
運(yùn)行
cursor.execute("EXPLAIN SELECT * FROM users WHERE age > 25")
print(cursor.fetchall())
- 避免
SELECT *,只查詢需要的列,減少數(shù)據(jù)傳輸和內(nèi)存占用
7.4 數(shù)據(jù)庫(kù)連接超時(shí)與重連機(jī)制
- 配置
connect_timeout參數(shù),避免長(zhǎng)時(shí)間等待 - 實(shí)現(xiàn)自動(dòng)重連邏輯,應(yīng)對(duì)數(shù)據(jù)庫(kù)重啟、網(wǎng)絡(luò)波動(dòng)等場(chǎng)景
運(yùn)行
def get_connection():
try:
conn = pymysql.connect(...)
return conn
except OperationalError:
# 重連3次
for i in range(3):
try:
conn = pymysql.connect(...)
return conn
except OperationalError:
time.sleep(1)
raise Exception("連接數(shù)據(jù)庫(kù)失敗")
7.5 讀寫分離實(shí)現(xiàn)
在高并發(fā)場(chǎng)景下,通過讀寫分離提升性能:主庫(kù)負(fù)責(zé)寫操作,從庫(kù)負(fù)責(zé)讀操作
運(yùn)行
# 主庫(kù)(寫操作)
master_conn = pymysql.connect(host="master_host", ...)
# 從庫(kù)(讀操作)
slave_conn = pymysql.connect(host="slave_host", ...)
# 寫操作走主庫(kù)
with master_conn.cursor() as cursor:
cursor.execute("INSERT INTO users VALUES (%s, %s)", ("Eve", 22))
master_conn.commit()
# 讀操作走從庫(kù)
with slave_conn.cursor() as cursor:
cursor.execute("SELECT * FROM users")
results = cursor.fetchall()
八、完整實(shí)戰(zhàn)案例:用戶管理系統(tǒng)
運(yùn)行
import pymysql
from dbutils.pooled_db import PooledDB
# 1. 初始化連接池
dbconfig = {
"host": "localhost",
"user": "root",
"password": "your_password",
"database": "testdb",
"port": 3306,
"charset": "utf8mb4"
}
pool = PooledDB(
creator=pymysql,
maxconnections=5,
mincached=2,
ping=1,
**dbconfig
)
# 2. 用戶CRUD操作
class UserManager:
def __init__(self):
self.conn = pool.connection()
self.cursor = self.conn.cursor()
def add_user(self, name, age):
"""添加用戶"""
try:
sql = "INSERT INTO users (name, age) VALUES (%s, %s)"
self.cursor.execute(sql, (name, age))
self.conn.commit()
return True
except pymysql.MySQLError as e:
print(f"添加用戶失敗: {e}")
self.conn.rollback()
return False
def get_user_by_name(self, name):
"""根據(jù)姓名查詢用戶"""
sql = "SELECT * FROM users WHERE name = %s"
self.cursor.execute(sql, (name,))
return self.cursor.fetchone()
def update_user_age(self, name, new_age):
"""更新用戶年齡"""
try:
sql = "UPDATE users SET age = %s WHERE name = %s"
self.cursor.execute(sql, (new_age, name))
self.conn.commit()
return True
except pymysql.MySQLError as e:
print(f"更新用戶失敗: {e}")
self.conn.rollback()
return False
def delete_user(self, name):
"""刪除用戶"""
try:
sql = "DELETE FROM users WHERE name = %s"
self.cursor.execute(sql, (name,))
self.conn.commit()
return True
except pymysql.MySQLError as e:
print(f"刪除用戶失敗: {e}")
self.conn.rollback()
return False
def close(self):
"""關(guān)閉連接(歸還到連接池)"""
self.cursor.close()
self.conn.close()
# 3. 測(cè)試
if __name__ == "__main__":
manager = UserManager()
# 添加用戶
manager.add_user("Eve", 22)
# 查詢用戶
print(manager.get_user_by_name("Eve"))
# 更新年齡
manager.update_user_age("Eve", 23)
# 刪除用戶
manager.delete_user("Eve")
# 關(guān)閉連接
manager.close()
九、總結(jié)
本文完整覆蓋了 Python 操作 MySQL 的全流程技術(shù):從基礎(chǔ)的連接庫(kù)安裝、數(shù)據(jù)庫(kù)連接與 CRUD 操作,到進(jìn)階的連接池優(yōu)化、事務(wù)管理與隔離級(jí)別,同時(shí)補(bǔ)充了異常處理、SQL 注入防護(hù)、批量操作、讀寫分離等實(shí)戰(zhàn)知識(shí)點(diǎn)。
核心要點(diǎn)回顧:
- 基礎(chǔ)操作:使用 PyMySQL 建立連接,通過游標(biāo)執(zhí)行 SQL,
%s占位符防注入 - 性能優(yōu)化:使用 DBUtils 連接池,減少連接開銷,提升高并發(fā)性能
- 數(shù)據(jù)一致性:通過事務(wù)管理保障數(shù)據(jù)安全,根據(jù)業(yè)務(wù)選擇合適的隔離級(jí)別
- 進(jìn)階技巧:異常處理、批量操作、索引優(yōu)化、讀寫分離等,解決實(shí)際開發(fā)中的各類問題
掌握這些技能,不僅能滿足運(yùn)維自動(dòng)化、后端開發(fā)中的數(shù)據(jù)庫(kù)操作需求,還能解決高并發(fā)場(chǎng)景下的性能瓶頸與數(shù)據(jù)一致性問題,是運(yùn)維工程師、后端開發(fā)的必備核心技能。
參考資料:
- PyMySQL 官方文檔:https://pymysql.readthedocs.io/
- DBUtils 官方文檔:https://webwareforpython.github.io/DBUtils/
- MySQL 事務(wù)隔離級(jí)別官方文檔:https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html
- Python MySQL 連接庫(kù)對(duì)比:https://realpython.com/python-mysql/
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Python3使用mysql-connector模塊連接MySQL數(shù)據(jù)庫(kù)
- Python中操作MySQL數(shù)據(jù)庫(kù)時(shí)如何處理數(shù)據(jù)類型轉(zhuǎn)換問題
- Python實(shí)現(xiàn)調(diào)用MySQL數(shù)據(jù)庫(kù)的存儲(chǔ)過程
- Python 使用 MySQL 數(shù)據(jù)庫(kù)進(jìn)行事務(wù)處理完整示例
- Python腳本連接MySQL數(shù)據(jù)庫(kù)的完整指南
- Python腳本實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)連接并插入數(shù)據(jù)
相關(guān)文章
Python實(shí)現(xiàn)K-近鄰算法的示例代碼
k-近鄰算法(K-Nearest Neighbour algorithm),又稱 KNN 算法,是數(shù)據(jù)挖掘技術(shù)中原理最簡(jiǎn)單的算法。本文將介紹實(shí)現(xiàn)K-近鄰算法的示例代碼,需要的可以參考一下2022-09-09
Python列表推導(dǎo)式實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了Python列表推導(dǎo)式實(shí)現(xiàn)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
Python文件操作及內(nèi)置函數(shù)flush原理解析
這篇文章主要介紹了Python文件操作及內(nèi)置函數(shù)flush原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
PyQt5之如何設(shè)置QWidget窗口背景圖片問題
這篇文章主要介紹了PyQt5之如何設(shè)置QWidget窗口背景圖片問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
python ndarray數(shù)組對(duì)象特點(diǎn)及實(shí)例分享
在本篇文章里小編給大家分享的是一篇關(guān)于python ndarray數(shù)組對(duì)象特點(diǎn)及實(shí)例相關(guān)內(nèi)容,有需要的朋友們跟著學(xué)習(xí)下。2021-10-10
opencv實(shí)現(xiàn)礦石圖片檢測(cè)礦石數(shù)量
這篇文章主要為大家詳細(xì)介紹了opencv實(shí)現(xiàn)礦石圖片檢測(cè)礦石數(shù)量,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
Python對(duì)象循環(huán)引用垃圾回收算法詳情
這篇文章主要介紹了Python對(duì)象循環(huán)引用垃圾回收算法詳情,文章圍繞主題展開詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-09-09

