Flask(六)数据库与模型操作

数据库是 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 里配置数据库连接:

python 复制代码
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)

其他数据库配置示例:

python 复制代码
# 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 里定义数据库模型:

python 复制代码
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 添加数据

python 复制代码
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 查询数据

python 复制代码
# 查询所有用户
users = User.query.all()

# 查询单个用户
user = User.query.filter_by(username="admin").first()

# 根据 ID 查询
user = User.query.get(1)

6.5.3 更新数据

python 复制代码
user = User.query.get(1)

user.email = "new_admin@example.com"

db.session.commit()

6.5.4 删除数据

python 复制代码
user = User.query.get(1)

db.session.delete(user)

db.session.commit()

6.6 关系映射(外键)

6.6.1 一对多关系

models.py 里定义用户和帖子(Post)的关系:

python 复制代码
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 一对一关系

python 复制代码
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 多对多关系

python 复制代码
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 里添加:

python 复制代码
from flask_migrate import Migrate

migrate = Migrate(app, db)

6.7.3 初始化数据库迁移

python 复制代码
flask db init

flask db migrate -m "Initial migration"

flask db upgrade

修改数据库模型后:

python 复制代码
flask db migrate -m "Added new field"

flask db upgrade

6.8 连接数据库到 Flask 视图

6.8.1 在 routes.py里创建视图****

python 复制代码
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

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 的用户认证系统,包括登录、注册、权限管理等。

相关推荐
G***T6914 分钟前
Python项目实战
开发语言·python
正在走向自律10 分钟前
金仓数据库引领新能源行业数字化转型:案例深度解析与领导力展现
数据库·国产数据库·kingbasees·金仓数据库·电科金仓·新能源行业
HAPPY酷25 分钟前
Flutter 开发环境搭建全流程
android·python·flutter·adb·pip
___波子 Pro Max.30 分钟前
Python中if __name__ == “__main__“的作用
python
黑仔要睡觉39 分钟前
Anaconda和Pycharm的卸载
开发语言·python
key_Go1 小时前
3-2.SQL语言(续)
数据库·mysql
电商API_180079052471 小时前
淘宝详情数据 API 返回字段全解析:核心字段说明 + 开发避坑指南
大数据·数据库·性能优化·数据挖掘·数据分析·网络爬虫
倔强的石头1061 小时前
从海量时序数据到无人值守:数据库在新能源集控系统中的架构实践
数据库·架构·金仓数据库
ZhengEnCi2 小时前
P3H0-Python-os模块完全指南-操作系统接口与文件路径处理利器
python·操作系统
草莓熊Lotso2 小时前
Git 本地操作进阶:版本回退、撤销修改与文件删除全攻略
java·javascript·c++·人工智能·git·python·网络协议