数据库是 Web 应用的重要组成部分,Flask 通过 SQLAlchemy 提供强大的 ORM(对象关系映射)功能,使开发者可以使用 Python 代码操作数据库,而无需编写复杂的 SQL 语句。
本章内容:
- Flask-SQLAlchemy 介绍
- 数据库配置
- 定义模型
- 数据库操作(CRUD)
- 数据迁移
- 关系映射
- 使用 Flask-Migrate 进行数据库迁移
6.1 安装 Flask-SQLAlchemy
Flask-SQLAlchemy 是 Flask 官方推荐的数据库扩展,封装了 SQLAlchemy,使数据库操作更加方便。
6.1.1 安装 Flask-SQLAlchemy:
pip install flask-sqlalchemy
6.2 配置 Flask-SQLAlchemy
在 app.py 里配置数据库连接:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# 配置 SQLite 数据库
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 关闭警告
db = SQLAlchemy(app)
其他数据库配置示例:
# MySQL
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@localhost/db_name'
# PostgreSQL
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://username:password@localhost/db_name'
6.3 定义模型
在 models.py 里定义数据库模型:
from app import db
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password = db.Column(db.String(60), nullable=False)
def __repr__(self):
return f"User('{self.username}', '{self.email}')"
字段类型:
类型 |
说明 |
Integer |
整数 |
String(n) |
字符串,最大长度 n |
Text |
大文本 |
Boolean |
布尔值 |
DateTime |
日期时间 |
Float |
浮点数 |
6.4 创建数据库
在 Python Shell 里执行:
python
然后运行:
from app import db
db.create_all()
这样,site.db 数据库就创建好了,并且包含 User 表。
6.5 数据库操作(CRUD)
6.5.1 添加数据
from app import db
from models import User
new_user = User(username="admin", email="admin@example.com", password="123456")
db.session.add(new_user)
db.session.commit()
6.5.2 查询数据
# 查询所有用户
users = User.query.all()
# 查询单个用户
user = User.query.filter_by(username="admin").first()
# 根据 ID 查询
user = User.query.get(1)
6.5.3 更新数据
user = User.query.get(1)
user.email = "new_admin@example.com"
db.session.commit()
6.5.4 删除数据
user = User.query.get(1)
db.session.delete(user)
db.session.commit()
6.6 关系映射(外键)
6.6.1 一对多关系
在 models.py 里定义用户和帖子(Post)的关系:
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
content = db.Column(db.Text, nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
user = db.relationship('User', backref=db.backref('posts', lazy=True))
示例:查询用户的帖子
user = User.query.get(1)print(user.posts) # 获取该用户的所有帖子
6.6.2 一对一关系
class Profile(db.Model):
id = db.Column(db.Integer, primary_key=True)
bio = db.Column(db.Text)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), unique=True)
user = db.relationship('User', backref=db.backref('profile', uselist=False))
6.6.3 多对多关系
tags = db.Table('tags',
db.Column('post_id', db.Integer, db.ForeignKey('post.id'), primary_key=True),
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'), primary_key=True)
)
class Tag(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), unique=True)
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
tags = db.relationship('Tag', secondary=tags, backref=db.backref('posts', lazy=True))
6.7 使用 Flask-Migrate 进行数据库迁移
数据库迁移允许在不丢失数据的情况下修改数据库结构。
6.7.1 安装 Flask-Migrate
pip install flask-migrate
6.7.2 配置 Flask-Migrate
在 app.py 里添加:
from flask_migrate import Migrate
migrate = Migrate(app, db)
6.7.3 初始化数据库迁移
flask db init
flask db migrate -m "Initial migration"
flask db upgrade
修改数据库模型后:
flask db migrate -m "Added new field"
flask db upgrade
6.8 连接数据库到 Flask 视图
6.8.1 在 routes.py 里创建视图
from flask import render_template
from models import User
@app.route('/users')
def show_users():
users = User.query.all()
return render_template('users.html', users=users)
6.8.2 创建 templates/users.html
<!DOCTYPE html>
<html><head>
<title>Users</title></head><body>
<h2>Users List</h2>
<ul>
{% for user in users %}
<li>{{ user.username }} - {{ user.email }}</li>
{% endfor %}
</ul></body>
</html>
6.9 结语
本章介绍了 Flask-SQLAlchemy 的核心概念:
- 安装和配置数据库
- 定义模型
- 执行 CRUD 操作
- 关系映射(外键)
- 迁移数据库结构
- 连接数据库到 Flask 视图
下一章将介绍 Flask 的用户认证系统,包括登录、注册、权限管理等。