Python 操作 MySQL 的標準驅動為 mysqlclient(MySQLdb 介面),效能優於純 Python 實作的 pymysql。本文涵蓋環境建置、連線參數、基礎 CRUD、參數化查詢與連線池進階用法。
sudo apt-get update
sudo apt-get install mysql-server mysql-client libmysqlclient-dev
pip install mysqlclient
sudo yum install mysql-devel gcc
pip install mysqlclient
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 | 讀寫逾時 | 無限 |
ssl | SSL 設定字典 | 不啟用 |
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 手動提交事務。%s 佔位符,絕不字串拼接 SQL。掌握 mysqlclient + 參數化查詢 + 連線池,即可構建高效、安全的 Python MySQL 資料存取層。