Python 連線 MySQL / PostgreSQL

Python 連線 MySQL / PostgreSQL

這篇教學把上一篇的 SQLite 經驗搬到正式環境:MySQL 與 PostgreSQL 是業界最常用的兩套開源資料庫。好消息是——Python 操作它們的流程跟 sqlite3 幾乎一模一樣(connect → cursor → execute → commit),只差連線方式與佔位符號。

資料庫推薦套件安裝佔位符
SQLite內建 sqlite3不用裝?
MySQL / MariaDBPyMySQLuv add pymysql%s
PostgreSQLpsycopguv add "psycopg[binary]"%s

(套件安裝與虛擬環境見 uv 教學。)

連線 MySQL:PyMySQL

import pymysql

conn = pymysql.connect(
    host="localhost",      # 資料庫主機
    port=3306,             # MySQL 預設埠
    user="root",
    password="你的密碼",
    database="school",
    charset="utf8mb4",     # 支援完整中文與 emoji,必設
)

cur = conn.cursor()
cur.execute("SELECT name, score FROM students WHERE score >= %s", (80,))

for name, score in cur.fetchall():
    print(f"{name}:{score} 分")

conn.close()

執行輸出(依資料庫內容而異):

小明:85 分
小華:92 分

兩個跟 sqlite3 不同的地方:佔位符是 %s(不是 ?,也不是 Python 的字串格式化——一樣是參數化查詢);charset="utf8mb4" 務必設定,否則中文可能變問號。

連線 PostgreSQL:psycopg

import psycopg

conn = psycopg.connect(
    host="localhost",
    port=5432,             # PostgreSQL 預設埠
    user="postgres",
    password="你的密碼",
    dbname="school",       # 注意:參數名是 dbname
)

with conn.cursor() as cur:
    cur.execute("INSERT INTO students (name, score) VALUES (%s, %s)", ("小強", 88))
    conn.commit()

conn.close()
print("寫入完成")

執行輸出:

寫入完成

psycopg 3 支援 with 管理 cursor 與連線,結構更乾淨。

連線資訊不要寫死在程式碼

帳號密碼放程式碼裡,commit 上 Git 就洩漏了。標準做法是放環境變數:

import os
import pymysql

conn = pymysql.connect(
    host=os.environ.get("DB_HOST", "localhost"),
    user=os.environ["DB_USER"],          # 沒設定就直接報錯,提醒你
    password=os.environ["DB_PASSWORD"],
    database="school",
    charset="utf8mb4",
)

實務上常搭配 .env 檔與 python-dotenv 套件管理,.env 記得加進 .gitignore

常見錯誤

1. 連線被拒(Connection refused / timed out)

資料庫沒啟動、host 或 port 錯、防火牆擋住。先用資料庫客戶端工具(如 DBeaver)確認連得上,再排查程式。

2. Access denied for user

帳號密碼錯誤,或該帳號沒有從你的 IP 連線的權限(MySQL 的使用者權限綁主機)。

3. 佔位符寫成 ?

? 是 sqlite3 的習慣,PyMySQL 與 psycopg 都用 %s,寫錯會報語法錯誤。注意 %s 雖長得像字串格式化,但不要用 f-string 或 % 運算子自己代入——交給 execute 的第二個參數。

總結

流程與 sqlite3 完全相同,記三件事:佔位符換成 %s、MySQL 設 charset="utf8mb4"、連線資訊放環境變數不進版控。SQL 語法本身與本站 SQL 教學系列通用。每次都手寫 SQL 字串有點累?下一篇的 SQLAlchemy ORM 讓你用 Python 物件操作資料庫。

延伸閱讀