当前位置:首页 > 技术 > 正文内容

Flask-SQLAlchemy数据库操作指南

访客 技术 2026年5月26日 3

ORM简介

ORM(Object-Relational Mapping)是对象关系映射的缩写,它能够将数据库表结构映射到程序中的模型类对象。通过实例化这些类并对其进行操作,可以间接完成对数据库表的操作。

使用ORM的主要优势包括:

  • 简化数据库操作:无需手动编写复杂的SQL语句。
  • 增强安全性:避免直接拼接SQL字符串,从而有效防止SQL注入攻击。

Python中常用的ORM框架有Django ORM和SQLAlchemy。其中,SQLAlchemy功能更为强大且灵活,支持多种数据库后端。

在Flask中集成SQLAlchemy

安装数据库驱动

无论使用哪种ORM框架,都需要先安装相应的数据库驱动程序。以MySQL为例,以下是常见的几种驱动:

  • mysqlclient:兼容性强,适合大多数场景。
  • PyMySQL:纯Python实现,但性能稍逊。

例如,使用mysqlclient时可以通过以下命令安装:

pip install mysqlclient

创建模型类

下面是一个简单的例子,展示如何定义两个表(角色表和用户表)以及它们之间的一对多关系:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@127.0.0.1:3306/test_db'
db = SQLAlchemy(app)

class RoleModel(db.Model):
    __tablename__ = 'roles'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), unique=True)

class UserModel(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(50), unique=True)
    email = db.Column(db.String(100), unique=True)
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
    role = db.relationship('RoleModel', backref='users')

数据库迁移

为了同步模型类与实际数据库结构,需要借助Flask-Migrate插件进行迁移操作。

安装Flask-Migrate

pip install flask-migrate

初始化迁移环境

首先设置环境变量:

export FLASK_APP=app.py

然后运行以下命令完成初始化:

flask db init
flask db migrate
flask db upgrade

测试数据操作

通过Flask Shell可以快速验证模型类的功能:

# 创建角色和用户
role_admin = RoleModel(name='admin')
db.session.add(role_admin)
db.session.commit()

user_xiaoming = UserModel(username='xiaoming', email='xiaoming@example.com', role_id=role_admin.id)
db.session.add(user_xiaoming)
db.session.commit()

# 查询关联关系
print(user_xiaoming.role.name)  # 输出 'admin'
print(role_admin.users[0].username)  # 输出 'xiaoming'

优化模型类

为提高可读性和易用性,可以重写__init____repr__方法:

class RoleModel(db.Model):
    ...

    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return f'<Role {self.name}>'

class UserModel(db.Model):
    ...

    def __init__(self, username, email, role):
        self.username = username
        self.email = email
        self.role = role

    def __repr__(self):
        return f'<User {self.username}>'

CRUD操作示例

新增记录

new_role = RoleModel(name='editor')
db.session.add(new_role)
db.session.commit()

批量新增

users = [
    UserModel(username='alice', email='alice@example.com', role=new_role),
    UserModel(username='bob', email='bob@example.com', role=new_role)
]
db.session.add_all(users)
db.session.commit()

删除记录

target_role = RoleModel.query.filter_by(name='editor').first()
db.session.delete(target_role)
db.session.commit()

更新记录

方式一:修改属性值后提交:

target_user = UserModel.query.filter_by(username='alice').first()
target_user.email = 'new_alice@example.com'
db.session.add(target_user)
db.session.commit()

方式二:直接调用update方法:

UserModel.query.filter_by(username='bob').update({'email': 'new_bob@example.com'})
db.session.commit()

查询记录

常见查询方法:

  • all():返回所有匹配项。
  • first():返回第一条匹配项。
  • get(id):根据主键ID获取单条记录。
  • filter_by():基于等值条件过滤。
  • filter():支持复杂条件过滤。

示例:

# 按条件查询
results = UserModel.query.filter(UserModel.email.endswith('@example.com')).all()

# 排序与分页
sorted_results = UserModel.query.order_by(UserModel.id.desc()).offset(1).limit(2).all()

# 分组统计
from sqlalchemy import func
grouped_results = db.session.query(UserModel.role_id, func.count(UserModel.role_id)).group_by(UserModel.role_id).all()
标签: FlaskSQLAlchemy

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。