Python 连接 MySQL 的「实战级开发教程」


一、准备工作(必须)

1️⃣ 安装 MySQL

确保你能登录:

复制代码
mysql -u root -p

2️⃣ 创建数据库和表(示例)

复制代码
CREATE DATABASE flask_demo DEFAULT CHARSET utf8mb4;

USE flask_demo;

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(100) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO users (username, password)
VALUES ('admin', '123456');

3️⃣ 安装 Python MySQL 驱动(重点)

强烈推荐 PyMySQL(最常用)

复制代码
pip install pymysql

(如果你之前 pip 有问题,用 python -m pip install pymysql


二、Python 连接 MySQL(最基础版)

复制代码
import pymysql

conn = pymysql.connect(
    host="localhost",
    port=3306,
    user="root",
    password="你的密码",
    database="flask_demo",
    charset="utf8mb4"
)

cursor = conn.cursor()

cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()

for row in rows:
    print(row)

cursor.close()
conn.close()

✅ 成功打印用户信息,说明连接 OK


三、封装一个 DB 工具类(推荐做法 ✅)

复制代码
import pymysql

class DB:
    def __init__(self):
        self.conn = pymysql.connect(
            host="localhost",
            port=3306,
            user="root",
            password="你的密码",
            database="flask_demo",
            charset="utf8mb4",
            cursorclass=pymysql.cursors.DictCursor  # 返回字典
        )

    def query(self, sql, params=None):
        with self.conn.cursor() as cursor:
            cursor.execute(sql, params or ())
            return cursor.fetchall()

    def execute(self, sql, params=None):
        with self.conn.cursor() as cursor:
            cursor.execute(sql, params or ())
            self.conn.commit()
            return cursor.lastrowid

    def close(self):
        self.conn.close()

四、查询示例(登录校验)

复制代码
db = DB()

user = db.query(
    "SELECT * FROM users WHERE username=%s AND password=%s",
    ("admin", "123456")
)

if user:
    print("登录成功:", user)
else:
    print("用户名或密码错误")

db.close()

参数化 SQL,防止 SQL 注入


五、Flask + MySQL 登录接口(实战重点 ✅)

1️⃣ 安装 Flask

复制代码
pip install flask

2️⃣ Flask 项目结构

复制代码
flask_mysql/
├── app.py
├── db.py
└── requirements.txt

3️⃣ db.py(数据库封装)

复制代码
import pymysql

def get_db():
    return pymysql.connect(
        host="localhost",
        port=3306,
        user="root",
        password="你的密码",
        database="flask_demo",
        charset="utf8mb4",
        cursorclass=pymysql.cursors.DictCursor
    )

4️⃣ app.py(登录接口)

复制代码
from flask import Flask, request, jsonify
from db import get_db
import pymysql

app = Flask(__name__)

@app.route("/login", methods=["POST"])
def login():
    data = request.get_json()
    username = data.get("username")
    password = data.get("password")

    db = get_db()
    try:
        with db.cursor() as cursor:
            sql = """
                SELECT id, username FROM users
                WHERE username=%s AND password=%s
            """
            cursor.execute(sql, (username, password))
            user = cursor.fetchone()
    finally:
        db.close()

    if user:
        return jsonify({
            "code": 0,
            "msg": "登录成功",
            "data": user
        })
    else:
        return jsonify({
            "code": 1,
            "msg": "用户名或密码错误"
        })

if __name__ == "__main__":
    app.run(debug=True)

5️⃣ 测试接口(Postman / curl)

复制代码
curl -X POST http://127.0.0.1:5000/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"123456"}'

六、SQLAlchemy ORM(进阶 · 强烈推荐)

企业项目几乎都用 ORM

安装

复制代码
pip install flask_sqlalchemy pymysql

示例(ORM 版)

复制代码
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = (
    "mysql+pymysql://root:密码@localhost/flask_demo?charset=utf8mb4"
)
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False

db = SQLAlchemy(app)

class User(db.Model):
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(50), unique=True)
    password = db.Column(db.String(100))

with app.app_context():
    db.create_all()

不用写 SQL

更安全

更易维护


七、常见错误 & 解决方案

错误 原因 解决
Access denied 密码 / 用户错 检查 MySQL 用户
Can't connect MySQL 没启动 net start mysql
charset 报错 未指定 utf8mb4 加 charset
SQL 注入 字符串拼 SQL %s占位符
中文乱码 编码不一致 utf8mb4

八、安全与规范(非常重要)

密码永远不要明文

复制代码
import hashlib
hashlib.sha256(password.encode()).hexdigest()

生产环境配置不写死

复制代码
app.config.from_envvar("APP_CONFIG")

连接用完必须关闭

SQL 必须参数化


九、学习路线建议

阶段 内容
第 1 步 PyMySQL 原生 SQL
第 2 步 Flask + MySQL API
第 3 步 SQLAlchemy ORM
第 4 步 事务 / 连接池
第 5 步 Redis + MySQL

十、一句话总结 ✅

Python 连 MySQL = 装驱动 → 建连接 → 写 SQL → 关连接

真实项目 = Flask + SQLAlchemy + 参数化 SQL