Flask 集成SQLAlchemy

在这一篇中,我们将学习如何在 Flask 中集成数据库,并使用 ORM(对象关系映射)来进行数据库操作。数据库是许多 Web 应用的核心组成部分,通过使用 Flask-SQLAlchemy 这个强大的工具,我们可以轻松地与数据库进行交互。

1. Flask-SQLAlchemy简介

Flask-SQLAlchemy 是 Flask 扩展的一部分,它简化了在 Flask 应用中使用 SQLAlchemy 进行数据库操作的过程。SQLAlchemy 是一个功能强大且灵活的 Python ORM 工具,它允许我们使用 Python 对象表示数据库中的表和记录。

安装 Flask-SQLAlchemy:

bash 复制代码
pip install Flask-SQLAlchemy

2. 定义模型

在 Flask-SQLAlchemy 中,模型是通过定义 Python 类来完成的。每个类都将成为数据库中的一张表。在 models.py 中,添加一个用户模型:

python 复制代码
from flask_sqlalchemy import SQLAlchemy
import pymysql

pymysql.install_as_MySQLdb()
db = SQLAlchemy()


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), nullable=False)
    age = db.Column(db.Integer, nullable=False, index=True)
    email = db.Column(db.String(120), nullable=False)

    def __repr__(self):
        return f"User('{self.username}', '{self.age}', '{self.email}')"


user_index = db.Index('user_index', User.username, User.email, unique=True)

注意:

由于连接的是mysql数据库,需要依赖MySQLdb,正常来说是要按照mysqlclient,但是按照这个依赖会报错:ERROR:pip.subprocessor:Getting requirements to build wheel exited with 1

所以改为安装pymysql来代替,但是需要加入这两行代码:

python 复制代码
import pymysql
pymysql.install_as_MySQLdb()

3. 初始化Flask-SQLAlchemy

在 Flask 应用中,首先需要进行初始化。在 __init__.py 文件中,添加以下代码:

python 复制代码
from flask import Flask
from .config import Config
from flask_migrate import Migrate


def create_app(config_class=Config):
    app = Flask(__name__)
    app.config.from_object(config_class)

    # 注册蓝图、扩展等其他应用组件
    from app.index import index_blueprint
    from app.auth import auth_blueprint

    app.register_blueprint(index_blueprint)
    app.register_blueprint(auth_blueprint)

    from .models import db
    db.init_app(app)
    migrate = Migrate(app, db)

    return app

4. 创建数据库表

当 Flask-SQLAlchemy 中的模型发生新增或者更新时,可以通过 Flask-Migrate 进行数据库迁移。数据库迁移是一种将数据库模式更新到最新版本的过程,它允许在不丢失数据的情况下进行数据库模型的修改。

安装 Flask-Migrate

bash 复制代码
pip install Flask-Migrate

使用 Flask-Migrate

bash 复制代码
# 初始化迁移环境,这会在应用目录中创建一个名为 `migrations` 的文件夹,用于存储迁移脚本
flask db init

# 模型发生更改时,运行以下命令来创建一个新的迁移脚本
flask db migrate -m "Your migration message"

# 运行以下命令将迁移应用到数据库
flask db upgrade

5. 数据库操作

python 复制代码
from ..models import User, db
from sqlalchemy import or_, text

# 添加一条新用户记录
new_user = User(username='john_doe', email='john@example.com', age=18)
db.session.add(new_user)
db.session.commit()

# 查询所有用户
all_users = User.query.all()
for user in all_users:
    print(user)

# 通过用户名查询单个用户
user = User.query.filter_by(username='john_doe').first()
print(user)

# or操作
users = User.query.filter(or_(User.username.like('J%'), User.email.like('%@example.com%'))).all()
for user in users:
    print(user)

# like操作
users = User.query.filter(User.username.like('J%')).all()
for user in users:
    print(user)

# 排序
users = User.query.order_by(User.username.desc()).all()
for user in users:
    print(user)

# count、sum
count = db.session.query(User).count()
print(count)

ages = db.session.query(db.func.sum(User.age)).scalar()
print(ages)

# 更新用户的邮箱地址
user = User.query.filter_by(username='john_doe').first()
user.email = 'new_email@example.com'
db.session.commit()

user = User.query.filter_by(username='john_doe').first()
print(user)

# 删除用户
user = User.query.filter_by(username='john_doe').first()
db.session.delete(user)
db.session.commit()

# 直接执行sql
result = db.session.execute(text('select * from user'))
print(len(result.fetchall()))

8. 总结

本文介绍了如何在 Flask 中集成数据库,并使用 Flask-SQLAlchemy 进行简单的 ORM 操作。在实际项目中,可以通过定义更多的模型和进行复杂的查询操作来满足需求。数据库是 Web 开发中不可或缺的一部分,Flask 和 SQLAlchemy 让我们能够以更 Pythonic 的方式进行数据库操作,提高了开发效率。

相关推荐
IT_陈寒7 小时前
Python开发者必知的5大性能陷阱:90%的人都踩过的坑!
前端·人工智能·后端
流浪克拉玛依8 小时前
Go Web 服务限流器实战:从原理到压测验证 --使用 Gin 框架 + Uber Ratelimit / 官方限流器,并通过 Vegeta 进行性能剖析
后端
Flittly8 小时前
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(3)TodoWrite (待办写入)
python·agent
孟沐8 小时前
保姆级教程:手写三层架构 vs MyBatis-Plus
后端
星浩AI8 小时前
让模型自己写 Skills——从素材到自动生成工作流
人工智能·后端·agent
华仔啊11 小时前
为啥不用 MP 的 saveOrUpdateBatch?MySQL 一条 SQL 批量增改才是最优解
java·后端
武子康11 小时前
大数据-242 离线数仓 - DataX 实战:MySQL 全量/增量导入 HDFS + Hive 分区(离线数仓 ODS
大数据·后端·apache hive
砍材农夫12 小时前
TCP和UDP区别
后端
千寻girling12 小时前
一份不可多得的 《 Django 》 零基础入门教程
后端·python·面试
千寻girling12 小时前
Python 是用来做 AI 人工智能 的 , 不适合开发 Web 网站 | 《Web框架》
人工智能·后端·算法