MySQLdb(即 mysqlclient)是 Python 連接 MySQL 最成熟、高效的驅動之一。本文覆蓋 Windows 下安裝、連接池配置、參數化查詢防注入、事務控制等實戰要點。
mysqlclient-2.1.1-cp310-cp310-win_amd64.whlpip install mysqlclient-2.1.1-cp310-cp310-win_amd64.whl# Debian/Ubuntu sudo apt-get install python3-dev default-libmysqlclient-dev build-essential pip3 install mysqlclient # CentOS/RHEL sudo yum install python3-devel mysql-devel gcc pip3 install mysqlclient
import MySQLdb
import time
from contextlib import contextmanager
# 連接配置建議從環境讀取或配置文件
DB_CONFIG = {
'host': 'localhost',
'user': 'root',
'passwd': 'root',
'db': 'Python',
'charset': 'utf8mb4', # 支援 emoji
'autocommit': False, # 手動控制事務
}
@contextmanager
def get_cursor():
conn = MySQLdb.connect(**DB_CONFIG)
try:
cursor = conn.cursor(MySQLdb.cursors.DictCursor) # 返回字典游標
yield cursor
conn.commit()
except Exception:
conn.rollback()
raise
finally:
cursor.close()
conn.close()
# === 示例業務邏輯 ===
with get_cursor() as cur:
# 1. 建表
cur.execute("""
CREATE TABLE IF NOT EXISTS thinkgamer (
name VARCHAR(128) PRIMARY KEY,
created INT(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
""")
# 2. 單條插入(參數化,防 SQL 注入)
sql = "INSERT INTO thinkgamer (name, created) VALUES (%s, %s)"
cur.execute(sql, ("aaa", int(time.time())))
print(f"insert: {cur.rowcount}")
# 3. 批量插入
data = [("bbb", int(time.time())), ("ccc", 33), ("ddd", 44)]
cur.executemany(sql, data)
print(f"insertmany: {cur.rowcount}")
# 4. 更新
cur.execute("UPDATE thinkgamer SET name=%s WHERE name=%s", ("zzz", "aaa"))
print(f"update: {cur.rowcount}")
# 5. 查詢
cur.execute("SELECT * FROM thinkgamer")
for row in cur.fetchall():
print(row) # DictCursor 返回 {'name': 'zzz', 'created': 1700000000}
# 6. 刪除
cur.execute("DELETE FROM thinkgamer WHERE name=%s", ("bbb",))
print(f"delete: {cur.rowcount}")
# 7. 再次查詢驗證
cur.execute("SELECT * FROM thinkgamer")
print(cur.fetchall())
DBUtils.PooledDB 或 SQLAlchemy Engine 管理連接,避免頻繁建連開銷。aiomysql(基於 asyncio)或 asyncmy。DictCursor 返回 datetime、Decimal 等原生類型,便於業務層直接使用。ssl={'ca': '/path/ca.pem'} 參數啟用加密傳輸。| 錯誤 | 原因 | 解決 |
|---|---|---|
mysql_config not found | 缺少 MySQL 開發頭文件 | 安裝 libmysqlclient-dev / mysql-devel |
Authentication plugin 'caching_sha2_password' not supported | MySQL 8.0 默認認證插件舊驅動不支援 | 升級 mysqlclient ≥ 1.4.0,或改用 mysql_native_password |
Column 'xxx' not found | JDBC/ODBC 別名元數據行為變更 | 連接串加 useOldAliasMetadataBehavior=true |