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

相关推荐
代码or搬砖14 小时前
RBAC(权限认证)小例子
java·数据库·spring boot
神仙别闹14 小时前
基于QT(C++)实现学本科教务系统(URP系统)
数据库·c++·qt
2301_7683502314 小时前
MySQL为什么选择InnoDB作为存储引擎
java·数据库·mysql
上海蓝色星球14 小时前
迈向智慧电网新纪元:上海蓝色星球数字孪生变电主子站系统
运维·数据库
木头左14 小时前
LSTM量化交易策略中时间序列预测的关键输入参数分析与Python实现
人工智能·python·lstm
是大芒果14 小时前
数据库表设计
数据库
哥哥还在IT中14 小时前
MySQL order by 如何优化
数据库·mysql
电子硬件笔记14 小时前
Python语言编程导论第七章 数据结构
开发语言·数据结构·python
积跬步,慕至千里15 小时前
postgre数据库大批量快速导出方法总结
数据库·postgres
HyperAI超神经15 小时前
【vLLM 学习】Prithvi Geospatial Mae
人工智能·python·深度学习·学习·大语言模型·gpu·vllm