萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

Python 連接 MySQL 完整教學:從安裝驅動到 CRUD 實戰

Python 操作 MySQL 的標準驅動為 mysqlclient(MySQLdb 介面),效能優於純 Python 實作的 pymysql。本文涵蓋環境建置、連線參數、基礎 CRUD、參數化查詢與連線池進階用法。

環境建置

Linux(Ubuntu/Debian/Deepin)

sudo apt-get update
sudo apt-get install mysql-server mysql-client libmysqlclient-dev
pip install mysqlclient

CentOS/RHEL

sudo yum install mysql-devel gcc
pip install mysqlclient

Windows

pip install mysqlclient
# 若報錯,下載預編譯 whl:https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient

驗證安裝

python -c "import MySQLdb; print('MySQLdb 版本:', MySQLdb.__version__)"

連線參數完整表

參數說明預設值
host資料庫主機localhost
port埠號3306
user使用者名稱當前系統用戶
passwd密碼無(必填)
db預設資料庫無(必填)
charset字符集utf8mb4(建議顯式指定)
cursorclass游標類型Cursor(元組);DictCursor 回傳字典
autocommit自動提交False
connect_timeout連線逾時(秒)10
read_timeout/write_timeout讀寫逾時無限
sslSSL 設定字典不啟用

基礎 CRUD 範本

import MySQLdb
from contextlib import closing

# 1. 建立連線(建議使用連線池,見下節)
conn = MySQLdb.connect(
    host='localhost', port=3306,
    user='root', passwd='123456',
    db='test', charset='utf8mb4',
    cursorclass=MySQLdb.cursors.DictCursor
)

with closing(conn) as conn, conn.cursor() as cur:
    # 建表
    cur.execute("""
        CREATE TABLE IF NOT EXISTS student (
            id INT PRIMARY KEY AUTO_INCREMENT,
            name VARCHAR(20),
            class VARCHAR(30),
            age TINYINT
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
    """)

    # 新增(參數化防注入)
    cur.execute("INSERT INTO student (name, class, age) VALUES (%s, %s, %s)",
                ('Tom', '3 year 2 class', 9))
    conn.commit()

    # 查詢
    cur.execute("SELECT * FROM student WHERE age > %s", (8,))
    for row in cur.fetchall():
        print(f"id={row['id']}, name={row['name']}, class={row['class']}, age={row['age']}")

    # 修改
    cur.execute("UPDATE student SET class=%s WHERE name=%s", ('3 year 1 class', 'Tom'))
    conn.commit()

    # 刪除
    cur.execute("DELETE FROM student WHERE age=%s", (9,))
    conn.commit()

# 連線自動關閉

進階:連線池

from DBUtils.PooledDB import PooledDB

pool = PooledDB(
    creator=MySQLdb,
    maxconnections=20,
    mincached=5,
    host='localhost', port=3306,
    user='root', passwd='123456',
    db='test', charset='utf8mb4',
    cursorclass=MySQLdb.cursors.DictCursor
)

# 取得連線
conn = pool.connection()
try:
    with conn.cursor() as cur:
        cur.execute("SELECT 1")
        print(cur.fetchone())
finally:
    conn.close()  # 歸還池,非真正關閉

常見坑點與對策

  • 編碼亂碼: 連線指定 charset='utf8mb4',資料庫/表/欄位同為 utf8mb4。
  • 連線中斷: 啟用 ping=True(mysqlclient 1.4+)或定期 conn.ping(reconnect=True)。
  • 大量寫入: 使用 executemany() 批次執行,配合 autocommit=False 手動提交事務。
  • SQL 注入: 永遠使用 %s 佔位符,絕不字串拼接 SQL。

掌握 mysqlclient + 參數化查詢 + 連線池,即可構建高效、安全的 Python MySQL 資料存取層。

copyright © 萬盛學電腦網 all rights reserved