1. MySQL Connector/Python 簡介
MySQL Connector/Python 是官方提供的函式庫,用於從 Python 程式連接 MySQL 資料庫並執行各種操作。透過它可以輕鬆且高效地完成資料庫連線、查詢執行、資料讀取與更新等基本操作。其優勢在於與 MySQL 的直接整合,並遵循 Python 的資料庫 API 標準 —— DB-API 2.0,因此能提供一致的介面,讓 Python 開發者以統一的方式進行資料庫操作。
為什麼要使用 MySQL Connector/Python
使用 MySQL Connector/Python,可以進行安全的資料庫操作以防止 SQL 注入。同時,它也能結合 Python 面向物件程式設計的優勢,使資料庫操作更加高效且靈活。此外,還支援預備語句(Prepared Statement)與跳脫處理(Escape),在效能與安全性上都是理想的選擇。
2. MySQL Connector/Python 的安裝與設定
要開始使用 MySQL Connector/Python,首先需要設定開發環境。以下將說明安裝方式與環境配置。
安裝方法
MySQL Connector/Python 可以透過 Python 的套件管理工具 pip
簡單安裝。請執行以下指令:
pip install mysql-connector-python
執行後會安裝最新版本的 MySQL Connector/Python。
開發環境設定
為了提升開發效率,建議搭配整合開發環境(IDE)使用,例如 PyCharm 或 VS Code。這些 IDE 提供自動完成與除錯功能,能大幅提升開發效率。請在 IDE 中設定好 Python 直譯器,並確認可使用剛安裝的 MySQL Connector/Python。
3. 連接 MySQL
以下說明如何使用 MySQL Connector/Python 連接 MySQL 資料庫。首先需理解基本概念並設定必要的參數。
連線參數設定
連接 MySQL 資料庫時需要以下資訊:
host
: 資料庫伺服器的主機名稱或 IPuser
: 資料庫使用者名稱password
: 使用者密碼database
: 要連接的資料庫名稱
透過這些資訊即可呼叫 connect
函式來建立連線。
範例程式碼
以下是連接 MySQL 資料庫的基本範例:
import mysql.connector
# 建立連線
conn = mysql.connector.connect(
host='localhost',
user='your_username',
password='your_password',
database='your_database'
)
# 確認連線是否成功
if conn.is_connected():
print('成功連接到 MySQL 資料庫。')
# 關閉連線
conn.close()
此範例透過指定的主機、使用者名稱、密碼與資料庫名稱連接至 MySQL,並透過 is_connected()
檢查連線是否成功,最後記得使用 close()
關閉連線。
4. 基本的資料庫操作
成功建立連線後,即可進行資料庫操作,例如建立資料表、新增、查詢、更新與刪除資料。
4.1 建立資料表
以下範例示範如何建立名為 users
的資料表:
# 建立游標
cursor = conn.cursor()
# 建立資料表的 SQL
create_table_query = '''
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
)
'''
# 執行建立資料表
cursor.execute(create_table_query)
此範例會建立 users
資料表,若已存在則不會重複建立。
4.2 插入資料
以下示範如何插入新資料:
# 插入資料的 SQL
insert_data_query = '''
INSERT INTO users (username, email) VALUES (%s, %s)
'''
# 欲插入的資料
user_data = ("Tanaka", "tanaka@example.com")
# 執行插入
cursor.execute(insert_data_query, user_data)
# 提交變更
conn.commit()
此範例會將新使用者資料插入 users
資料表。
4.3 查詢資料
以下示範如何從資料表中查詢資料:
# 查詢資料的 SQL
select_query = "SELECT * FROM users WHERE username = %s"
# 執行查詢
cursor.execute(select_query, ("Tanaka",))
# 取得結果
result = cursor.fetchone()
print(result)
此範例會從 users
資料表中查詢使用者名稱為 Tanaka
的資料。
4.4 更新資料
以下示範如何更新既有資料:
# 更新資料的 SQL
update_query = "UPDATE users SET email = %s WHERE username = %s"
# 執行更新
cursor.execute(update_query, ("tanaka.new@example.com", "Tanaka"))
# 提交變更
conn.commit()
此範例會將 Tanaka
的電子郵件更新為新的地址。
4.5 刪除資料
最後,以下示範如何刪除資料:
# 刪除資料的 SQL
delete_query = "DELETE FROM users WHERE username = %s"
# 執行刪除
cursor.execute(delete_query, ("Tanaka",))
# 提交變更
conn.commit()
此範例會刪除 users
資料表中使用者名稱為 Tanaka
的紀錄。
5. 參數化查詢與預備語句
在 MySQL Connector/Python 中,透過參數化查詢(Placeholder)與預備語句(Prepared Statement)可以提升安全性與效能。這樣能降低 SQL 注入風險,並加快重複查詢的執行效率。
5.1 使用參數化查詢
使用參數化查詢能動態指定 SQL 語句中的值,並避免 SQL 注入。以下為範例:
# 查詢資料的 SQL
select_query = "SELECT * FROM users WHERE username = %s"
# 使用參數化查詢
cursor.execute(select_query, ("Tanaka",))
# 取得結果
result = cursor.fetchone()
print(result)
此範例中的 %s
為參數化佔位符,會被安全地替換成指定的值。
5.2 使用預備語句
若相同查詢需重複執行,使用預備語句可提升效能。以下為範例:
# 建立支援預備語句的游標
cursor = conn.cursor(prepared=True)
# 定義預備語句
stmt = "SELECT * FROM users WHERE username = ?"
# 執行查詢
cursor.execute(stmt, ("Tanaka",))
# 取得結果
result = cursor.fetchone()
print(result)
指定 prepared=True
後即可使用 ?
來作為佔位符,提升效能並確保安全性。
預備語句的優點
- 安全性:防止 SQL 注入攻擊。
- 效能:相同查詢只需解析一次,提高執行速度。
6. 跳脫處理與從連線直接執行 SQL
在產生動態 SQL 或處理包含特殊字元的資料時,需要進行跳脫處理(Escape)。MySQL Connector/Python 提供了相關函式來簡化操作。
6.1 跳脫處理
可使用連線物件的 converter.escape
來處理字串中的特殊字元:
# 跳脫處理範例
escaped_string = conn.converter.escape("O'Reilly")
print(escaped_string) # 輸出: O'Reilly
如此即可安全處理含有引號的字串。
6.2 從連線物件直接執行 SQL
雖然通常建議使用游標,但在某些情況下也能透過 cmd_query
直接執行 SQL。不過此方法不支援參數化,需自行進行跳脫處理。
# 直接執行 SQL 查詢
stmt = "SELECT * FROM users WHERE username = '%s'"
conn.cmd_query(stmt % conn.converter.escape("Tanaka"))
由於風險較高,建議一般情況下仍使用游標與參數化查詢。
7. 錯誤處理與最佳實踐
在進行資料庫操作時,可能會發生錯誤,因此必須妥善處理錯誤並遵循最佳實踐。
7.1 錯誤處理範例
建議透過 try-except
區塊來捕捉錯誤:
import mysql.connector
from mysql.connector import Error
try:
conn = mysql.connector.connect(
host='localhost',
user='your_username',
password='your_password',
database='your_database'
)
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
results = cursor.fetchall()
for row in results:
print(row)
except Error as e:
print(f"發生錯誤: {e}")
finally:
if conn.is_connected():
cursor.close()
conn.close()
print("MySQL 連線已關閉。")
7.2 資料庫操作的最佳實踐
- 管理連線:資料庫連線會消耗資源,不使用時請務必關閉。
- 使用參數化查詢:避免 SQL 注入,請使用參數化佔位符。
- 例外處理:必須用
try-except
處理可能的錯誤。 - 交易(Transaction):必要時使用交易確保資料一致性,支援多筆操作一併提交或回滾。
8. 總結
MySQL Connector/Python 是一個強大且實用的工具,可讓 Python 開發者輕鬆連接並操作 MySQL 資料庫。本文介紹了安裝設定、基本操作、安全強化(參數化查詢與預備語句)、跳脫處理與錯誤處理等重點。熟練這些技巧後,能夠開發更高效且安全的資料庫應用程式。
建議讀者持續深入學習 MySQL Connector/Python 的進階功能,並參考官方文件與相關資源,以發揮其最大效益。