最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python操作MySQL數(shù)據(jù)庫(kù)實(shí)踐

 更新時(shí)間:2026年04月11日 08:55:16   作者:kiku1818  
本文詳細(xì)介紹了Python操作MySQL數(shù)據(jù)庫(kù)的全流程技術(shù),從基礎(chǔ)連接庫(kù)安裝、CRUD操作,到進(jìn)階的連接池優(yōu)化、事務(wù)管理與隔離級(jí)別,并補(bǔ)充了異常處理、SQL注入防護(hù)、批量操作優(yōu)化等知識(shí)點(diǎn),幫助讀者掌握Python操作MySQL的核心技能,適用于運(yùn)維開發(fā)及數(shù)據(jù)庫(kù)學(xué)習(xí)者

本文系統(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-pythonMySQL 官方推薦庫(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-pythonPyMySQL,其中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ù)用戶名,通常為root
  • password:數(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、JOINORDER 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ā)的必備核心技能。

參考資料:

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python實(shí)現(xiàn)K-近鄰算法的示例代碼

    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í)例

    這篇文章主要介紹了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原理解析

    這篇文章主要介紹了Python文件操作及內(nèi)置函數(shù)flush原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • PyQt5之如何設(shè)置QWidget窗口背景圖片問題

    PyQt5之如何設(shè)置QWidget窗口背景圖片問題

    這篇文章主要介紹了PyQt5之如何設(shè)置QWidget窗口背景圖片問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • python ndarray數(shù)組對(duì)象特點(diǎn)及實(shí)例分享

    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ù)量

    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)引用垃圾回收算法詳情

    這篇文章主要介紹了Python對(duì)象循環(huán)引用垃圾回收算法詳情,文章圍繞主題展開詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-09-09
  • 詳解Python如何將多張照片制作成視頻

    詳解Python如何將多張照片制作成視頻

    這篇文章主要詳解為大家介紹了Python如何將多張照片制作成視頻,文章通過一個(gè)例子給大家介紹多張照片制作成視頻的方法,代碼示例介紹的非常詳細(xì),感興趣的同學(xué)可以參考一下
    2023-07-07
  • python3 cookbook中常遇問題解答

    python3 cookbook中常遇問題解答

    本文主要介紹了python3 cookbook中常遇問題解答,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • python實(shí)現(xiàn)祝福彈窗效果

    python實(shí)現(xiàn)祝福彈窗效果

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)祝福彈窗效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04

最新評(píng)論

崇州市| 金沙县| 沙坪坝区| 西乌珠穆沁旗| 桂平市| 平昌县| 三江| 亳州市| 平和县| 阿城市| 揭阳市| 西吉县| 延吉市| 大连市| 河东区| 卓尼县| 新宁县| 陆川县| 抚远县| 赤城县| 曲靖市| 吉安市| 安平县| 筠连县| 年辖:市辖区| 诸暨市| 昌乐县| 体育| 隆子县| 紫金县| 云和县| 犍为县| 临城县| 鄱阳县| 水城县| 固安县| 九江市| 金平| 东安县| 宽甸| 商洛市|