一、准备工作(必须)
1️⃣ 安装 MySQL
-
macOS:
brew install mysql -
Linux:
sudo apt install mysql-server
确保你能登录:
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