Python 程式連線
Python 連線 MySQL 常用套件是 `mysql-connector-python`,也可以使用 `PyMySQL`。以下以官方 Connector/Python 為例。
## 1. 安裝套件
```bash
pip install mysql-connector-python
```
## 2. 建立資料庫連線
```python
import mysql.connector
conn = mysql.connector.connect(
host="127.0.0.1", # MySQL 主機
port=3306, # MySQL 埠號
user="root", # 使用者名稱
password="your_password",
database="testdb", # 要使用的資料庫
charset="utf8mb4"
)
print("資料庫連線成功")
```
也可以先檢查是否連線成功:
```python
if conn.is_connected():
print("Connected")
```
連線參數通常包括:
| 參數 | 說明 |
|---|---|
| `host` | MySQL 伺服器位址 |
| `port` | 預設為 `3306` |
| `user` | MySQL 使用者 |
| `password` | 密碼 |
| `database` | 要使用的資料庫 |
| `charset` | 建議使用 `utf8mb4` |
---
## 3. 建立資料表
要執行 SQL,必須先建立游標(cursor)。
```python
cursor = conn.cursor()
sql = """
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(200) UNIQUE,
age INT
)
"""
cursor.execute(sql)
conn.commit()
cursor.close()
conn.close()
```
`commit()` 的作用是確認並儲存 `INSERT`、`UPDATE`、`DELETE` 等異動。
---
## 4. 執行 INSERT
```python
import mysql.connector
conn = mysql.connector.connect(
host="127.0.0.1",
user="root",
password="your_password",
database="testdb"
)
cursor = conn.cursor()
sql = """
INSERT INTO users (name, email, age)
VALUES (%s, %s, %s)
"""
values = ("Alice", "alice@example.com", 25)
cursor.execute(sql, values)
conn.commit()
print("新增資料的 ID:", cursor.lastrowid)
cursor.close()
conn.close()
```
### 使用多筆資料
```python
users = [
("Bob", "bob@example.com", 30),
("Carol", "carol@example.com", 28),
("David", "david@example.com", 35)
]
cursor.executemany(sql, users)
conn.commit()
print("新增筆數:", cursor.rowcount)
```
注意:MySQL Connector 使用 `%s` 作為參數佔位符,不要自行用字串格式化 SQL,例如:
```python
# 不建議,容易造成 SQL Injection
sql = f"SELECT * FROM users WHERE name = '{name}'"
```
應改用參數化查詢:
```python
sql = "SELECT * FROM users WHERE name = %s"
cursor.execute(sql, (name,))
```
---
## 5. 執行 SELECT 並取得資料
### 取得一筆資料:`fetchone()`
```python
cursor = conn.cursor()
sql = "SELECT id, name, email, age FROM users WHERE id = %s"
cursor.execute(sql, (1,))
row = cursor.fetchone()
if row is not None:
print(row)
print("ID:", row[0])
print("姓名:", row[1])
print("Email:", row[2])
print("年齡:", row[3])
else:
print("找不到資料")
```
結果可能如下:
```python
(1, 'Alice', 'alice@example.com', 25)
```
---
### 取得全部資料:`fetchall()`
```python
sql = "SELECT id, name, email, age FROM users ORDER BY id"
cursor.execute(sql)
rows = cursor.fetchall()
for row in rows:
print(row)
```
---
### 逐筆讀取資料
資料很多時,不一定要一次使用 `fetchall()`,可以逐筆處理:
```python
cursor.execute("SELECT id, name, email FROM users")
for row in cursor:
print(row)
```
---
## 6. 以欄位名稱取得資料
預設查詢結果是 tuple。如果希望使用欄位名稱,可以建立 dictionary cursor:
```python
cursor = conn.cursor(dictionary=True)
cursor.execute("SELECT id, name, email, age FROM users")
rows = cursor.fetchall()
for row in rows:
print(row["id"], row["name"], row["email"], row["age"])
```
資料格式會類似:
```python
{
"id": 1,
"name": "Alice",
"email": "alice@example.com",
"age": 25
}
```
---
## 7. 執行 UPDATE 和 DELETE
### UPDATE
```python
sql = """
UPDATE users
SET age = %s
WHERE id = %s
"""
cursor.execute(sql, (26, 1))
conn.commit()
print("更新筆數:", cursor.rowcount)
```
### DELETE
```python
sql = "DELETE FROM users WHERE id = %s"
cursor.execute(sql, (1,))
conn.commit()
print("刪除筆數:", cursor.rowcount)
```
---
## 8. 使用例外處理與正確關閉資源
完整範例:
```python
import mysql.connector
from mysql.connector import Error
conn = None
cursor = None
try:
conn = mysql.connector.connect(
host="127.0.0.1",
port=3306,
user="root",
password="your_password",
database="testdb",
charset="utf8mb4"
)
cursor = conn.cursor(dictionary=True)
sql = """
INSERT INTO users (name, email, age)
VALUES (%s, %s, %s)
"""
cursor.execute(sql, ("Alice", "alice@example.com", 25))
conn.commit()
cursor.execute(
"SELECT * FROM users WHERE email = %s",
("alice@example.com",)
)
user = cursor.fetchone()
print(user)
except Error as e:
print("資料庫錯誤:", e)
if conn is not None and conn.is_connected():
conn.rollback()
finally:
if cursor is not None:
cursor.close()
if conn is not None and conn.is_connected():
conn.close()
print("資料庫連線已關閉")
```
---
## 9. 使用 `with` 自動管理游標
部分情況下,可以使用 `with` 自動關閉游標:
```python
import mysql.connector
conn = mysql.connector.connect(
host="127.0.0.1",
user="root",
password="your_password",
database="testdb"
)
with conn.cursor(dictionary=True) as cursor:
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
for row in rows:
print(row)
conn.close()
```
---
## 10. 基本流程總結
Python 操作 MySQL 的一般流程是:
```text
1. 安裝 MySQL Connector
2. 建立資料庫連線
3. 建立 cursor
4. 使用 cursor.execute() 執行 SQL
5. SELECT 使用 fetchone()、fetchall() 取得資料
6. INSERT、UPDATE、DELETE 後執行 commit()
7. 發生錯誤時執行 rollback()
8. 關閉 cursor 和 connection
```
最基本的範例可以簡化為:
```python
import mysql.connector
conn = mysql.connector.connect(
host="localhost",
user="root",
password="your_password",
database="testdb"
)
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
for row in cursor.fetchall():
print(row)
cursor.close()
conn.close()
```
相關學習地圖、教學課程
Python 後端工程、資料庫