MySQL 使用簡介
MySQL 是全世界最普及的開源關聯式資料庫之一,目前由 Oracle 維護,大量網站後端(例如 WordPress)都使用它;MariaDB 則是由 MySQL 原作者分支出來、高度相容的開源版本。本頁介紹如何安裝或用 Docker 啟動 MySQL,以及用 Python 的 PyMySQL 或 mysql-connector-python 讀寫 MySQL 資料庫。
安裝 MySQL
- 本機安裝:至 MySQL Community Downloads 下載 MySQL Community Server,並可一併安裝圖形化工具 MySQL Workbench。
- 使用 Docker(建議用於開發):
docker run --name my_mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -p 3306:3306 -v /path/to/your/local/directory:/var/lib/mysql -d mysql:8.4
參數意義與 PostgreSQL 的 Docker 指令 相同;MYSQL_ROOT_PASSWORD 設定管理者 root 的密碼,mysql:8.4 是長期支援(LTS)版本。
用命令列客戶端連線並建立專案用的資料庫與帳號:
CREATE DATABASE app_db CHARACTER SET utf8mb4;
CREATE USER 'app_user'@'%' IDENTIFIED BY 'app_password';
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'%';
SHOW DATABASES;
中文與 Emoji 請用 utf8mb4
MySQL 的 utf8 其實只支援到 3 個位元組,存不了 Emoji 與部分罕用字。建立資料庫與資料表時請使用 utf8mb4(MySQL 8 起為預設值),Python 連線時也指定 charset="utf8mb4"。
1. 使用 PyMySQL
PyMySQL 是純 Python 實作的 MySQL 驅動,安裝簡單、跨平台。
1.1 安裝 PyMySQL
1.2 連接到 MySQL 並讀取數據
import pymysql
# 連接到 MySQL 資料庫
conn = pymysql.connect(
host="localhost",
user="your_username",
password="your_password",
database="your_database",
port=3306, # 預設 MySQL 埠號是 3306,如果你使用的是不同的埠號,請在這裡指定
charset="utf8mb4",
)
# 創建 cursor
cursor = conn.cursor()
# 執行 SQL 查詢(參數以 %s 佔位)
cursor.execute("SELECT * FROM your_table WHERE id > %s", (0,))
# 獲取所有查詢結果
rows = cursor.fetchall()
# 打印每一行
for row in rows:
print(row)
# 關閉 cursor 和連接
cursor.close()
conn.close()
想讓每一列以 dict 形式回傳,可在連線時加上 cursorclass=pymysql.cursors.DictCursor。
2. 使用 mysql-connector-python
mysql-connector-python 是 MySQL 官方(Oracle)提供的驅動。
2.1 安裝 mysql-connector-python
2.2 連接到 MySQL 並讀取數據
import mysql.connector
# 連接到 MySQL 資料庫
conn = mysql.connector.connect(
host="localhost",
user="your_username",
password="your_password",
database="your_database",
port=3306, # 預設 MySQL 埠號是 3306,如果你使用的是不同的埠號,請在這裡指定
)
# 創建 cursor
cursor = conn.cursor()
# 執行 SQL 查詢
cursor.execute("SELECT * FROM your_table")
# 獲取所有查詢結果
rows = cursor.fetchall()
# 打印每一行
for row in rows:
print(row)
# 關閉 cursor 和連接
cursor.close()
conn.close()
3. 寫入資料記得 commit
兩個套件預設都不會自動提交交易。執行 INSERT、UPDATE、DELETE 之後,必須呼叫 conn.commit(),否則關閉連線時變更會被捨棄:
cursor.execute(
"INSERT INTO users (name, age) VALUES (%s, %s)",
("Alice", 30),
)
conn.commit()
print(cursor.lastrowid) # 自動遞增產生的 id
4. 程式碼說明
| 名稱 | 說明 |
|---|---|
conn |
與 MySQL 資料庫的連線物件 |
cursor |
游標,透過它執行 SQL 語句並取得結果 |
execute() |
執行一條 SQL 語句;參數用 %s 佔位並以 tuple 傳入,避免 SQL 注入 |
fetchall() / fetchone() |
取得全部結果/逐筆取得結果 |
commit() |
提交交易,讓寫入真正生效 |
close() |
完成操作後,關閉游標和連線 |
推薦影音
MySQL Workbench Tutorial(MySQL 官方頻道)
簡述:MySQL 官方 YouTube 頻道示範如何用 MySQL Workbench 連線伺服器、瀏覽資料表、撰寫與執行查詢,適合剛安裝好 MySQL 的初學者。
MySQL 資料庫安裝、快速開始(彭彭的課程)
簡述:台灣講師彭彭以中文示範 MySQL 的下載安裝與第一次連線使用,屬於「MySQL 資料庫全攻略」系列的一集,適合偏好中文講解的入門者。
MySQL - The Basics: Learn SQL in 23 Easy Steps(Fireship)
簡述:用 17 分鐘、23 個步驟快速走過 MySQL 的安裝、建表、查詢、JOIN 與索引,節奏很快,適合已有程式基礎、想快速上手的人。
相關資料
官方認證課程
Oracle 提供 MySQL 訓練與認證,包含 MySQL 8.0 Database Administrator(考試 1Z0-908)與 MySQL 8.0 Database Developer(考試 1Z0-909),適合想取得正式認證的資料庫管理者與後端工程師。