首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Python 連接 MySQL 資料庫完整指南:安裝、連線、CRUD 與進階技巧

     編輯:MySQL 資料庫相關知識

Python 連接 MySQL 資料庫完整指南:安裝、連線、CRUD 與進階技巧


環境準備

1. 安裝 MySQL Server

  • Windows:官網下載 MSI 安裝。
  • Linux:sudo apt install mysql-server (Ubuntu/Debian) 或 sudo yum install mysql-server (CentOS/RHEL)。
  • 設定 root 密碼、建立應用專用帳號與資料庫。

2. 安裝 Python MySQL 驅動

推薦 **mysqlclient**(C 封裝、效能最佳、支援 Python 3.7+):

pip install mysqlclient

替代選擇:

  • PyMySQL:純 Python 實作、無需編譯、相容性佳 pip install PyMySQL。
  • mysql-connector-python:Oracle 官方驅動。

資料庫連線參數詳解

import MySQLdb

conn = MySQLdb.connect(
    host='localhost',        # 資料庫主機
    port=3306,               # 埠號,預設 3306
    user='root',             # 登入帳號
    passwd='your_password',  # 密碼
    db='my_database',        # 目標資料庫
    charset='utf8mb4',       # 字元集(支援 emoji)
    autocommit=False,        # 手動控制交易
    cursorclass=MySQLdb.cursors.DictCursor  # 回傳 dict 而非 tuple
)
參數預設值說明
hostlocalhost主機名/IP
port3306埠號
user當前系統用戶登入帳號
passwd無密碼(必填)
db無資料庫名(必填)
charsetlatin1**強烈建議 utf8mb4**
cursorclassCursorDictCursor 方便欄位名存取
sslNoneSSL 連線配置字典
connect_timeout10連線逾時秒數

基礎 CRUD 操作範例

# 建立游標
cur = conn.cursor()

# CREATE TABLE
cur.execute("""
    CREATE TABLE IF NOT EXISTS students (
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(50) NOT NULL,
        class VARCHAR(30),
        age TINYINT
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
""")

# INSERT 單筆(參數化防注入)
cur.execute("INSERT INTO students (name, class, age) VALUES (%s, %s, %s)",
            ('Tom', '3年2班', 9))

# INSERT 多筆(批次高效)
cur.executemany("INSERT INTO students (name, class, age) VALUES (%s, %s, %s)", [
    ('Jack', '2年1班', 8),
    ('Mary', '1年3班', 7),
])

# UPDATE
cur.execute("UPDATE students SET class=%s WHERE name=%s", ('3年1班', 'Tom'))

# DELETE
cur.execute("DELETE FROM students WHERE age=%s", (9,))

# SELECT 查詢
cur.execute("SELECT * FROM students WHERE class LIKE %s", ('3年%',))
rows = cur.fetchall()  # 取得所有列
for row in rows:
    print(f"{row['id']}: {row['name']} - {row['class']} - {row['age']}")

# 交易控制
conn.commit()   # 提交
# conn.rollback() # 回滾

# 關閉資源
cur.close()
conn.close()

進階技巧與最佳實踐

1. 連線池:DBUtils.PooledDB

from DBUtils.PooledDB import PooledDB

pool = PooledDB(
    creator=MySQLdb,
    maxconnections=20,
    mincached=5,
    host='localhost', user='root', passwd='pwd', db='mydb', charset='utf8mb4'
)

# 取得連線
conn = pool.connection()
# 用完後 close() 實際歸還池中,不關閉實體連線

2. 內容管理器自動釋放(Python 3.7+)

with MySQLdb.connect(**config) as conn:
    with conn.cursor() as cur:
        cur.execute("SELECT VERSION()")
        print(cur.fetchone())
# 自動 commit/rollback & close

3. 大量資料高效匯入:LOAD DATA LOCAL INFILE

cur.execute("""
    LOAD DATA LOCAL INFILE '/path/data.csv'
    INTO TABLE students
    FIELDS TERMINATED BY ',' ENCLOSED BY '\"'
    LINES TERMINATED BY '\n'
    IGNORE 1 LINES
    (name, class, age)
""")
# 需連線參數 local_infile=True

4. 異步操作:aiomysql (asyncio)

import aiomysql
async def fetch():
    pool = await aiomysql.create_pool(host='localhost', user='root', password='pwd', db='mydb')
    async with pool.acquire() as conn:
        async with conn.cursor() as cur:
            await cur.execute("SELECT * FROM students")
            return await cur.fetchall()

常見錯誤與排查

錯誤原因解決
ModuleNotFoundError: MySQLdb未安裝 mysqlclientpip install mysqlclient (需 gcc/mysql-devel)
Authentication plugin 'caching_sha2_password' not supportedMySQL 8.0 新預設驗證插件帳號改用 mysql_native_password 或升級驅動
OperationalError: (2003, "Can't connect to MySQL server")主機/埠/防火牆/服務未啟動檢查 3306 埠、bind-address=0.0.0.0、防火牆規則
UnicodeEncodeError 儲存中文/emoji字元集非 utf8mb4連線 charset=utf8mb4、資料庫/表/欄位 CHARSET=utf8mb4

ORM 推薦:SQLAlchemy / Tortoise-ORM

專案規模較大時,建議使用 **SQLAlchemy (同步/非同步)** 或 **Tortoise-ORM (異步優先)**,提供:

  • 模型定義、遷移
  • 關聯載入、查詢建構器
  • 交易管理、連線池整合
  • 型別提示、IDE 自動完成

掌握原生驅動操作是理解 ORM 底層行為的基石,實務中視專案規模選擇適當抽象層級。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved