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 的方式进行数据库操作,提高了开发效率。

相关推荐
9 分钟前
Python 图片处理:裁剪缩放至300×200,格式JPG/PNG/GIF,控制大小≤100KB
linux·前端·python
2601_9622946112 分钟前
Python工具软件开发:借助InsCode AI IDE开启智能编程新时代
ide·python·ai·开发工具·智能化编程
2601_962097362 小时前
GraphQL,Grafana和Dash
python·grafana·数据可视化·graphql·dash
mldong7 小时前
C# 开发者也有自己的轻量工作流引擎了:NuGet 装包,5 分钟跑通一条审批流
后端·c#·.net
爱学堂IT分享9 小时前
鹤翔老师pmp项目管理培训认证考试课 (直播录播题库送学时证明)【共58课时】-51CTO学堂
后端
benchmark_cc10 小时前
REST API 和 Python SDK 应该怎么选?量化交易数据接口选型实战
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
王的宝库10 小时前
Go 项目结构:从单文件到标准工程布局
开发语言·后端·golang
码事漫谈11 小时前
类型即世界:一个 C++ 程序员的本体论入门
后端
2601_9623824311 小时前
python快乐编程网络爬虫课后答案
python·网络爬虫·学习工具·课后答案·刷题app
Rain的Java大神之路11 小时前
JavaWeb开发如何解决跨域问题
java·前端·后端·nginx·web安全·面试·运维开发