Python操作MySQL數(shù)據(jù)庫實踐
本文系統(tǒng)梳理 Python 操作 MySQL 數(shù)據(jù)庫的全流程技術(shù)棧,從基礎(chǔ)的 PyMySQL 連接庫安裝、數(shù)據(jù)庫連接與增刪改查操作,到進(jìn)階的連接池優(yōu)化、事務(wù)管理與隔離級別深度解析,同時補(bǔ)充了圖片未覆蓋的異常處理、SQL 注入防護(hù)、批量操作優(yōu)化、上下文管理器等實用知識點。
全文以運(yùn)維開發(fā)視角,結(jié)合實戰(zhàn)代碼與原理說明,幫助讀者掌握 Python 操作 MySQL 的核心技能,解決高并發(fā)場景下的性能瓶頸與數(shù)據(jù)一致性問題,適合運(yùn)維工程師、后端開發(fā)及數(shù)據(jù)庫學(xué)習(xí)者參考學(xué)習(xí)。
一、前言
在現(xiàn)代應(yīng)用程序與運(yùn)維自動化開發(fā)中,數(shù)據(jù)庫操作是核心環(huán)節(jié)之一。
MySQL 作為最流行的開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS),廣泛應(yīng)用于中小規(guī)模業(yè)務(wù)系統(tǒng)、運(yùn)維監(jiān)控平臺、數(shù)據(jù)采集工具等場景。
Python 憑借簡潔的語法和豐富的生態(tài),成為操作 MySQL 的首選語言之一:我們可以通過連接庫與 MySQL 數(shù)據(jù)庫交互,實現(xiàn)數(shù)據(jù)的增、刪、改、查,同時通過連接池、事務(wù)管理等技術(shù)優(yōu)化性能、保障數(shù)據(jù)一致性。
二、Python MySQL 連接庫的選擇與安裝
2.1 主流連接庫對比
Python 操作 MySQL 有多個成熟的連接庫,不同庫的適用場景和特性各有差異:
| 連接庫 | 特點 | 適用場景 |
|---|---|---|
| mysql-connector-python | MySQL 官方推薦庫,純 Python 實現(xiàn),無需依賴 C 編譯器,兼容性強(qiáng) | 跨平臺部署、無編譯環(huán)境的場景 |
| PyMySQL | 純 Python 實現(xiàn),兼容 MySQLdb 接口,輕量易用,社區(qū)活躍 | 主流 Python 項目、運(yùn)維自動化腳本 |
| mysqlclient | 基于 C 語言實現(xiàn),性能更高,兼容 Django 等框架 | 高并發(fā)、高性能要求的后端項目 |
圖片中重點介紹了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ù)庫的完整流程
3.1 基礎(chǔ)連接步驟
(1)導(dǎo)入連接庫
運(yùn)行
import pymysql
(2)創(chuàng)建數(shù)據(jù)庫連接
使用pymysql.connect()方法建立連接,核心參數(shù)說明:
host:MySQL 服務(wù)器地址,本地為localhost,遠(yuǎn)程為 IP 地址user:數(shù)據(jù)庫用戶名,通常為rootpassword:數(shù)據(jù)庫密碼database:要連接的數(shù)據(jù)庫名稱port:MySQL 端口,默認(rèn) 3306(可省略)charset:字符集,推薦utf8mb4(支持 emoji 等特殊字符)connect_timeout:連接超時時間(秒),避免長時間等待
完整示例:
運(yùn)行
# 建立數(shù)據(jù)庫連接
db = pymysql.connect(
host="localhost",
user="root",
password="your_password",
database="testdb",
port=3306,
charset="utf8mb4",
connect_timeout=10
)
(3)創(chuàng)建游標(biāo)對象
游標(biāo)是執(zhí)行 SQL 語句的核心對象,用于發(fā)送 SQL 命令、接收執(zhí)行結(jié)果:
運(yùn)行
cursor = db.cursor()
補(bǔ)充知識點:游標(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 語句
通過游標(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語句自動管理連接和游標(biāo),無需手動關(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)
# 自動關(guān)閉連接和游標(biāo)
四、MySQL 常見 CRUD 操作詳解
4.1 插入數(shù)據(jù)(INSERT)
使用INSERT INTO語句,通過%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ǔ)充知識點:批量插入優(yōu)化
executemany()比多次execute()性能提升 10-100 倍,適合批量數(shù)據(jù)導(dǎo)入- 可通過
cursor.lastrowid獲取自增主鍵 ID:print(cursor.lastrowid)
4.2 更新數(shù)據(jù)(UPDATE)
使用UPDATE語句,必須加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語句,必須加WHERE條件,避免誤刪全表數(shù)據(jù):
運(yùn)行
sql = "DELETE FROM users WHERE name = %s"
cursor.execute(sql, ("Alice",)) # 注意逗號,確保是元組
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 語句,必須使用
%s占位符
錯誤示例(存在注入風(fēng)險):
運(yùn)行
# 危險!用戶輸入惡意內(nèi)容會導(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ù)編譯語句、限制數(shù)據(jù)庫用戶權(quán)限、開啟防火墻等
五、連接池技術(shù):高并發(fā)場景的性能優(yōu)化
5.1 連接池的核心原理
直接創(chuàng)建數(shù)據(jù)庫連接存在嚴(yán)重的性能問題:每次連接都需要 TCP 三次握手、身份驗證、資源分配,頻繁創(chuàng)建 / 銷毀會導(dǎo)致系統(tǒng)性能急劇下降。
連接池的核心思想:提前創(chuàng)建一批數(shù)據(jù)庫連接,放入連接池中,客戶端需要時從池中獲取,使用后歸還,避免重復(fù)創(chuàng)建 / 銷毀的開銷,同時限制最大連接數(shù),防止數(shù)據(jù)庫過載。
5.2 基于 DBUtils 實現(xiàn)連接池
PyMySQL 本身不支持連接池,需使用DBUtils庫實現(xiàn),安裝命令:
運(yùn)行
pip install dbutils
完整連接池實現(xiàn)代碼
運(yùn)行
from dbutils.pooled_db import PooledDB
import pymysql
# 數(shù)據(jù)庫連接配置
dbconfig = {
"host": "localhost",
"user": "root",
"password": "your_password",
"database": "testdb",
"port": 3306,
"charset": "utf8mb4"
}
# 創(chuàng)建連接池
connection_pool = PooledDB(
creator=pymysql, # 使用PyMySQL作為連接庫
maxconnections=5, # 最大連接數(shù),根據(jù)數(shù)據(jù)庫配置調(diào)整
mincached=2, # 初始化時創(chuàng)建的空閑連接數(shù)
maxcached=3, # 最大空閑連接數(shù)
maxshared=3, # 最大共享連接數(shù)
blocking=True, # 連接池滿時是否阻塞等待
setsession=[], # 會話初始化SQL
ping=1, # 自動檢測連接有效性(1=每次獲取連接時檢測)
**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)和連接(連接自動歸還到連接池)
cursor.close()
db_connection.close()
5.3 連接池的核心優(yōu)勢
- 性能提升:減少連接創(chuàng)建 / 銷毀的開銷,高并發(fā)場景下性能提升 5-10 倍
- 資源管理:限制最大連接數(shù),避免過多連接導(dǎo)致數(shù)據(jù)庫崩潰
- 高可用性:自動檢測連接有效性,避免使用失效連接
- 統(tǒng)一管理:統(tǒng)一配置連接參數(shù),簡化代碼維護(hù)
5.4 補(bǔ)充:連接池參數(shù)詳解
maxconnections:最大連接數(shù),建議設(shè)置為 MySQLmax_connections的 80% 以內(nèi)mincached:最小空閑連接數(shù),保證隨時有可用連接maxcached:最大空閑連接數(shù),避免空閑連接占用過多資源ping:連接有效性檢測,1表示每次獲取連接時檢測,防止 "僵死連接"blocking:連接池滿時,True表示阻塞等待,False表示拋出異常
六、事務(wù)管理:保障數(shù)據(jù)一致性
6.1 事務(wù)的核心特性(ACID)
事務(wù)是由多個 SQL 語句組成的工作單元,必須滿足 ACID 特性:
- 原子性(Atomicity):事務(wù)中的操作要么全部成功,要么全部失敗回滾
- 一致性(Consistency):事務(wù)執(zhí)行前后,數(shù)據(jù)庫的完整性約束不被破壞
- 隔離性(Isolation):多個并發(fā)事務(wù)之間相互隔離,互不干擾
- 持久性(Durability):事務(wù)提交后,數(shù)據(jù)永久保存到數(shù)據(jù)庫,不會因系統(tǒng)故障丟失
6.2 事務(wù)的基本操作
(1)開啟事務(wù)
MySQL 默認(rèn)自動提交事務(wù),需手動關(guān)閉自動提交,開啟事務(wù):
運(yùn)行
# 關(guān)閉自動提交(開啟事務(wù)模式)
db.autocommit = False
# 或顯式開啟事務(wù)
cursor.execute("START TRANSACTION")
(2)提交事務(wù)
所有操作成功后,提交事務(wù),保存數(shù)據(jù):
運(yùn)行
db.commit()
(3)回滾事務(wù)
操作失敗時,回滾事務(wù),撤銷所有修改:
運(yùn)行
db.rollback()
6.3 事務(wù)隔離級別詳解
MySQL 支持 4 種事務(wù)隔離級別,解決并發(fā)事務(wù)中的 3 類問題:
- 臟讀:事務(wù) A 讀取了事務(wù) B 未提交的數(shù)據(jù),事務(wù) B 回滾后,A 讀取的數(shù)據(jù)無效
- 不可重復(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 種隔離級別對比
| 隔離級別 | 臟讀 | 不可重復(fù)讀 | 幻讀 | 性能 | 適用場景 |
|---|---|---|---|---|---|
| READ UNCOMMITTED(未提交讀) | 允許 | 允許 | 允許 | 最高 | 數(shù)據(jù)一致性要求極低的場景(幾乎不使用) |
| READ COMMITTED(提交讀) | 禁止 | 允許 | 允許 | 高 | 大多數(shù)業(yè)務(wù)場景(如電商普通訂單) |
| REPEATABLE READ(可重復(fù)讀,MySQL 默認(rèn)) | 禁止 | 禁止 | 允許(MySQL 通過 MVCC 解決) | 中 | 金融、財務(wù)等數(shù)據(jù)一致性要求高的場景 |
| SERIALIZABLE(串行化) | 禁止 | 禁止 | 禁止 | 最低 | 數(shù)據(jù)一致性要求極高的場景(如銀行轉(zhuǎn)賬) |
隔離級別設(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ù)實戰(zhàn)案例:轉(zhuǎn)賬操作
運(yùn)行
import pymysql
# 連接數(shù)據(jù)庫
conn = pymysql.connect(
host="localhost",
user="root",
password="your_password",
database="testdb",
charset="utf8mb4"
)
cursor = conn.cursor()
# 關(guān)閉自動提交,開啟事務(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ā)生錯誤,回滾事務(wù)
print(f"轉(zhuǎn)賬失敗: {err}")
conn.rollback()
finally:
# 關(guān)閉游標(biāo)和連接
cursor.close()
conn.close()
6.5 補(bǔ)充:事務(wù)異常處理最佳實踐
- 必須使用
try-except-finally結(jié)構(gòu),確保異常時回滾事務(wù) - 事務(wù)中避免執(zhí)行耗時操作,減少鎖等待時間
- 長事務(wù)會導(dǎo)致鎖競爭,影響系統(tǒng)性能,盡量縮短事務(wù)執(zhí)行時間
- 可通過
SAVEPOINT設(shè)置事務(wù)回滾點,實現(xiàn)部分回滾:
運(yùn)行
cursor.execute("SAVEPOINT point1")
# 部分操作
cursor.execute("ROLLBACK TO SAVEPOINT point1")
七、圖片未覆蓋的進(jìn)階知識點補(bǔ)充
7.1 異常處理與錯誤排查
(1)常見異常類型
pymysql.MySQLError:MySQL 相關(guān)錯誤的基類pymysql.OperationalError:連接錯誤、權(quán)限錯誤、超時等pymysql.ProgrammingError:SQL 語法錯誤、表不存在等pymysql.IntegrityError:主鍵沖突、外鍵約束失敗等
(2)完整異常處理模板
運(yùn)行
import pymysql
from pymysql.err import MySQLError, OperationalError, ProgrammingError
try:
# 數(shù)據(jù)庫操作
conn = pymysql.connect(...)
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
conn.commit()
except OperationalError as e:
print(f"連接錯誤: {e}")
# 重連邏輯
except ProgrammingError as e:
print(f"SQL語法錯誤: {e}")
except MySQLError as e:
print(f"數(shù)據(jù)庫錯誤: {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)入(百萬級以上),性能是 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í)行計劃,優(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ù)庫連接超時與重連機(jī)制
- 配置
connect_timeout參數(shù),避免長時間等待 - 實現(xiàn)自動重連邏輯,應(yīng)對數(shù)據(jù)庫重啟、網(wǎng)絡(luò)波動等場景
運(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ù)庫失敗")
7.5 讀寫分離實現(xiàn)
在高并發(fā)場景下,通過讀寫分離提升性能:主庫負(fù)責(zé)寫操作,從庫負(fù)責(zé)讀操作
運(yùn)行
# 主庫(寫操作)
master_conn = pymysql.connect(host="master_host", ...)
# 從庫(讀操作)
slave_conn = pymysql.connect(host="slave_host", ...)
# 寫操作走主庫
with master_conn.cursor() as cursor:
cursor.execute("INSERT INTO users VALUES (%s, %s)", ("Eve", 22))
master_conn.commit()
# 讀操作走從庫
with slave_conn.cursor() as cursor:
cursor.execute("SELECT * FROM users")
results = cursor.fetchall()
八、完整實戰(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. 測試
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ǔ)的連接庫安裝、數(shù)據(jù)庫連接與 CRUD 操作,到進(jìn)階的連接池優(yōu)化、事務(wù)管理與隔離級別,同時補(bǔ)充了異常處理、SQL 注入防護(hù)、批量操作、讀寫分離等實戰(zhàn)知識點。
核心要點回顧:
- 基礎(chǔ)操作:使用 PyMySQL 建立連接,通過游標(biāo)執(zhí)行 SQL,
%s占位符防注入 - 性能優(yōu)化:使用 DBUtils 連接池,減少連接開銷,提升高并發(fā)性能
- 數(shù)據(jù)一致性:通過事務(wù)管理保障數(shù)據(jù)安全,根據(jù)業(yè)務(wù)選擇合適的隔離級別
- 進(jìn)階技巧:異常處理、批量操作、索引優(yōu)化、讀寫分離等,解決實際開發(fā)中的各類問題
掌握這些技能,不僅能滿足運(yùn)維自動化、后端開發(fā)中的數(shù)據(jù)庫操作需求,還能解決高并發(fā)場景下的性能瓶頸與數(shù)據(jù)一致性問題,是運(yùn)維工程師、后端開發(fā)的必備核心技能。
參考資料:
- PyMySQL 官方文檔:https://pymysql.readthedocs.io/
- DBUtils 官方文檔:https://webwareforpython.github.io/DBUtils/
- MySQL 事務(wù)隔離級別官方文檔:https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html
- Python MySQL 連接庫對比:https://realpython.com/python-mysql/
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python文件操作及內(nèi)置函數(shù)flush原理解析
這篇文章主要介紹了Python文件操作及內(nèi)置函數(shù)flush原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10
PyQt5之如何設(shè)置QWidget窗口背景圖片問題
這篇文章主要介紹了PyQt5之如何設(shè)置QWidget窗口背景圖片問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06
python ndarray數(shù)組對象特點及實例分享
在本篇文章里小編給大家分享的是一篇關(guān)于python ndarray數(shù)組對象特點及實例相關(guān)內(nèi)容,有需要的朋友們跟著學(xué)習(xí)下。2021-10-10

