个人名片
作者简介:java领域优质创作者
个人主页:码农阿豪
工作室:新空间代码工作室(提供各种软件服务)
个人邮箱:[[email protected]]
个人微信:15279484656
个人导航网站:www.forff.top
座右铭:总有人要赢。为什么不能是我呢?
码农阿豪系列专栏导航
面试专栏:收集了java相关高频面试题,面试实战总结️
Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用
Redis专栏:Redis从零到一学习分享,经验总结,案例实战
全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有
下载MySQL安装包
安装步骤
# 1. 运行安装程序,选择"Developer Default"安装类型
# 2. 在安装过程中设置root用户密码(建议使用强密码)
# 3. 配置MySQL服务端口(默认3306)
# 4. 完成安装后,将MySQL的bin目录添加到系统PATH环境变量
验证安装
mysql --version
# 应该显示类似: mysql Ver 8.0.xx for Win64 on x86_64 (MySQL Community Server - GPL)
使用Homebrew安装
brew install mysql
brew services start mysql
安全配置
mysql_secure_installation
以Ubuntu为例:
sudo apt update
sudo apt install mysql-server
sudo systemctl start mysql
sudo mysql_secure_installation
-- 登录MySQL
mysql -u root -p
-- 创建专用数据库
CREATE DATABASE flask_demo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 创建应用专用用户
CREATE USER 'flask_user'@'localhost' IDENTIFIED BY 'secure_password';
-- 授权
GRANT ALL PRIVILEGES ON flask_demo.* TO 'flask_user'@'localhost';
-- 刷新权限
FLUSH PRIVILEGES;
pip install pymysql flask-sqlalchemy
在app.py
中添加数据库配置:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# 配置数据库连接
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://flask_user:secure_password@localhost:3306/flask_demo'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_ECHO'] = True # 开发时显示SQL语句
db = SQLAlchemy(app)
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
created_at = db.Column(db.DateTime, server_default=db.func.now())
def __repr__(self):
return f'{self.username}>'
class Post(db.Model):
__tablename__ = 'posts'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(120), nullable=False)
content = db.Column(db.Text, nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
author = db.relationship('User', backref=db.backref('posts', lazy=True))
def __repr__(self):
return f'{self.title}>'
创建init_db.py
文件:
from app import app, db
with app.app_context():
db.create_all()
print("数据库表已创建!")
运行:
python init_db.py
@app.route('/add_user')
def add_user():
new_user = User(username='张三', email='[email protected]')
db.session.add(new_user)
db.session.commit()
return '用户添加成功!'
@app.route('/users')
def list_users():
users = User.query.all() # 获取所有用户
return render_template('users.html', users=users)
@app.route('/user/' )
def show_user(username):
user = User.query.filter_by(username=username).first_or_404()
return render_template('user.html', user=user)
@app.route('/update_email//' )
def update_email(username, new_email):
user = User.query.filter_by(username=username).first()
if user:
user.email = new_email
db.session.commit()
return '邮箱更新成功!'
return '用户不存在!'
@app.route('/delete_user/' )
def delete_user(username):
user = User.query.filter_by(username=username).first()
if user:
db.session.delete(user)
db.session.commit()
return '用户删除成功!'
return '用户不存在!'
# 分页查询
@app.route('/posts/' )
def show_posts(page=1):
per_page = 10
pagination = Post.query.order_by(Post.id.desc()).paginate(page, per_page, error_out=False)
return render_template('posts.html', pagination=pagination)
# 复杂查询
@app.route('/search')
def search():
keyword = request.args.get('q', '')
results = Post.query.filter(
(Post.title.contains(keyword)) |
(Post.content.contains(keyword))
).join(User).filter(User.username == '张三').all()
return render_template('search.html', results=results)
安装Flask-Migrate:
pip install flask-migrate
配置迁移:
from flask_migrate import Migrate
migrate = Migrate(app, db)
初始化迁移仓库:
flask db init
创建迁移脚本:
flask db migrate -m "initial migration"
应用迁移:
flask db upgrade
连接池配置
app.config['SQLALCHEMY_POOL_SIZE'] = 20
app.config['SQLALCHEMY_POOL_TIMEOUT'] = 300
app.config['SQLALCHEMY_POOL_RECYCLE'] = 3600
敏感信息保护
.env
文件:DB_USER=flask_user
DB_PASS=secure_password
import os
from dotenv import load_dotenv
load_dotenv()
app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{os.getenv('DB_USER')}:{os.getenv('DB_PASS')}@localhost:3306/flask_demo"
性能优化
# 批量插入
db.session.bulk_insert_mappings(User, [
{'username': 'user1', 'email': '[email protected]'},
{'username': 'user2', 'email': '[email protected]'}
])
# 只查询需要的列
users = db.session.query(User.username, User.email).all()
错误处理
@app.route('/safe_delete/' )
def safe_delete(user_id):
try:
user = User.query.get_or_404(user_id)
db.session.delete(user)
db.session.commit()
return '删除成功'
except Exception as e:
db.session.rollback()
app.logger.error(f'删除用户失败: {str(e)}')
return '删除失败', 500
本篇教程详细介绍了:
通过这些知识,你已经能够在Flask应用中集成MySQL数据库,实现数据的持久化存储。在下一篇专栏中,我们将探讨更高级的ORM特性、性能优化技巧以及多数据库连接等主题。