Flask 之 SQLAlchemy

Flask数据库操作及Flask-SQLAlchemy Flask数据库操作-Flask-SQLAlchemy 阅读详情

SQLAlchemy 是 Python 下非常好的 ORM 框架,支持使用 MySQL、PostgreSQL、SQLite 等主流数据库。Flask-SQLAlchemy 基于 SQLAlchemy 对 Flask 进行了适配,使其在 Flask 下的使用变得简单。


1. 建立模型

在建立模型之前,需要对客户需求进行分析。

假设现在需要实现一个简单的文章发布系统,用户可以在其中发布文章,管理员用户可管理(增、删、改、查)所有文章。此处可以将以上需求分解为“用户模块”与“文章模块”,然后为各个模板设计相应的模型。

如果需要实现基本的登录功能,则用户模型需要拥有“用户名”“密码”这些属性。用户还可以作为管理员,为了区分普通用户和管理员,用户模型还需要拥有“是否为管理员”属性。另外,如果需要创建文章,便需要使用“id”属性将用户模型与文章模型进行关联。

这里使用的是 SQLite 数据库,可视化工具为 sqlitestudio。

表 1 用户模型结构

模型属性Python 中数据类型数据表中字段类型说明
idintINTEGER用于指向用户的唯一编号
usernamestrVARCHAR用户名
passwordstrVARCHAR密码
is_adminboolBOOLEAN是否为管理员

表2 文章模型结构

模型属性Python 中数据类型数据表中字段类型说明
idintINTEGER用于指向文章的唯一编号
titlestrVARCHAR文章标题
contentstrVARCHAR文章正文内容

初始化 Flask-SQLAlchemy 并且定义用户模型和文章模型

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import os
from flask import Flask, render_template
from flask_script import Manager, Shell
from flask_sqlalchemy import SQLAlchemy


app = Flask(__name__)
# 设置数据库存储位置
basedir = os.path.abspath(os.path.dirname(__file__))
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'data.sqlite')
app.config['SQLCLCHEMY_TRACK_MODIFICATIONS'] = False
# flask_sqlalchemy 初始化代码
db = SQLAlchemy()
db.init_app(app)
manager = Manager(app)

@app.route('/', methods=['post'])
def login():
    return "Hello World!"

# 定义用户模型
class UserModel(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.INTEGER, primary_key=True, autoincrement=True)
    username = db.Column(db.VARCHAR, unique=True)
    password = db.Column(db.VARCHAR)
    is_admin = db.Column(db.BOOLEAN, default=False, nullable=False)

# 定义文章模型
class ArticleModel(db.Model):
    __tablename__ = 'article'
    id = db.Column(db.INTEGER, primary_key=True)
    title = db.Column(db.VARCHAR)
    content = db.Column(db.VARCHAR)

# 交互式 shell
def make_shell_context():
    return dict(app=app, db=db, UserModel=UserModel, ArticleModel=ArticleModel)
manager.add_command('shell', Shell(make_context=make_shell_context))


if __name__ == "__main__":
    manager.run()

输入命令 python app.py shell 进入交互界面,用命令 db.create_all()创建数据库 data.sqlite。


2. 数据操作

通常情况下数据库的操作主要通过 SQL 语句进行,而 SQLAlchemy 提供了将数据映射到对象中的操作方式。这样的方式使得对数据的操作变得简单,使用者无须学习 SQL 语法即可完成数据操作。

2.1 增加数据

增加数据(交互式 shell)

# 创建用户对象
In [1]: user_1 = UserModel(
   ...: username='admin',
   ...: password='123456',
   ...: is_admin=True)
In [2]: user_2 = UserModel(
   ...: username='user',
   ...: password='123456',
   ...: is_admin=False)

# 将用户对象添加到数据操作队列
In [3]: db.session.add(user_1)

In [4]: db.session.add(user_2)

In [5]: db.session.commit()

2.2 查询数据

如果需要在 Python 中获取相应的用户数据,则需要通过模型类查询来实现。如果要实现用户登录,便只需要将用户输入数据与数据库中查询到的用户数据进行比较,正确则登录成功,反之登录失败。

模型类查询代码(交互式 shell)

# 获取所有用户对象
In [1]: users = UserModel.query.all()

In [2]: print(users)
[<UserModel 1>, <UserModel 2>]

# 获取所有符合条件的用户对象
In [3]: users = UserModel.query.filter_by(is_admin=True).all()

In [4]: print(users)
[<UserModel 1>]

# 获取所有符合条件的用户对象的数据
In [5]: num = UserModel.query.filter_by(is_admin=True).count()

In [6]: print(num)
1

# 获取一个符合条件的用户对象
In [7]: user = UserModel.query.filter(UserModel.id > 1).first()

In [8]: print(user)
<UserModel 2>

2.3 修改数据

In [1]: user = UserModel.query.get(2)

In [2]: user.password = 'admin'

In [3]: user.is_admin = True

In [4]: db.session.add(user)

In [5]: db.session.commit()

2.4 删除数据

删除数据的操作是建立在查询数据基础之上的,在获取到模型对象后,将模型对象加入数据操作队列,执行提交即可进行改动。不同之处在于,删除时使用 delete() 方法进行操作。

In [10]: user1 = UserModel.query.get(1)

In [11]: user2 = UserModel.query.get(2)

In [12]: db.session.delete(user1)

In [13]: db.session.delete(user2)

In [14]: db.session.commit()

3. 高级查询

交互式 shell

# 快速添加5 个测试用的文章模型
for i in range(5):
    article = ArticleModel(title=' 文章_%d' % i, content='This is article_%d.' % i)

db.session.add(article)

article = ArticleModel(title=' 测试文章1', content='Hello World!')

db.session.add(article)

article = ArticleModel(title=' 测试文章2', content='Hello Flask!')

db.session.add(article)

db.session.commit()
# 从第 3  个对象(索引从 0  开始)开始,获取所有数据
articles = ArticleModel.query.offset(2).all()
print(articles)
# 获取前 2  个对象
articles = ArticleModel.query.limit(2).all()
print(articles)
# 从第 2  个对象开始,获取 3  个对象
articles = ArticleModel.query.offset(1).limit(3).all()
print(articles)
# 获取所有文章对象,并根据 id 对所有文章进行降序排列
articles = ArticleModel.query.order_by(ArticleModel.id.desc()).all()
print(articles)
# 获取所有文章对象,并根据 id 对所有文章进行升序排列(默认)
articles = ArticleModel.query.order_by(ArticleModel.id.asc()).all()
print(articles)
# 获取文章内容中包含“Hello ”的所有文章
articles = ArticleModel.query.filter(ArticleModel.content.contains('Hello')).all()
print(articles)
# 引入 and_ 、or_ 操作
from sqlalchemy import and_, or_
# 获取文章内容中包含“article”,或文章标题中包含“测试”的所有文章
articles = ArticleModel.query.filter(or_(
           ArticleModel.content.contains('article'),
           ArticleModel.title.contains(' 测试'),
           )).all()
print(articles)
# 获取id > 3 ,且文章内容中包含“article”的所有文章
articles = ArticleModel.query.filter(and_(
           ArticleModel.id > 3,
           ArticleModel.content.contains('article'),
           )).all()
print(articles)

4. 模型关联

在网站使用流程中,文章由用户创建,即每一篇文章都会对应一个作者;可以根据文章找到对应的用户,也可以根据特定的用户查询到与之对应的文章。 要实现上述效果,仅需为这两个模型建立外键关联。 在文章模型代码中添加外键(作者id),以及反向关联属性(在用户模型中定义)。

# 定义用户模型
class UserModel(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.INTEGER, primary_key=True, autoincrement=True)
    username = db.Column(db.VARCHAR, unique=True)
    password = db.Column(db.VARCHAR)
    is_admin = db.Column(db.BOOLEAN, default=False, nullable=False)
    # 建立一对多映射关系(uselist=True)
    # 为了便于IDE 识别变量类型,此处声明articles 类型为list
    articles: list = db.relationship('ArticleModel', backref='author', uselist=True)

# 定义文章模型
class ArticleModel(db.Model):
    __tablename__ = 'article'
    id = db.Column(db.INTEGER, primary_key=True)
    title = db.Column(db.VARCHAR)
    content = db.Column(db.VARCHAR)
    # 根据用户 id 与文章模型进行外键关联
    # author_id 不作为主键,为了保证效率,需要为字段建立索引(index=True)
    author_id = db.Column(db.INTEGER, db.ForeignKey('user.id'), index=True)
    # 声明 author 属性类型,以便 IDE 进行识别
    author: UserModel

5. 数据分页显示

数据分页显示是一个很常见的功能。例如之前所设计的文章模型,当文章数量达到一定程度(例如10篇)时,便不再适合在单个页面中展示,这时便需要用到数据分页显示功能,使每一页加载部分文章数据。 当然,像这种常见需求,Flask-SQLAlchemy与Flask-Bootstrap都已经实现好了,只要引入相应功能并使用即可。

@app.route('/paginator')
def paginator():
    # 每页显示 3 篇文章
    pagination = ArticleModel.query.paginate(per_page=3)
    return render_template('paginator1.html', pagination=pagination)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>数据分页显示</title>
    {% import 'pagination.html' as pagi %}
</head>
<body>
    <div class="container">
        {% for item in pagination.items %}
        <h1>{{ item.title }}</h1>
        <p>{{ item.content | safe }}</p>
        {% endfor %}
        {#  根据pagination(分页)对象渲染分页按钮 #}
        {{ pagi.render_pagination(pagination) }}
    </div>
</body>
</html>
Flask框架中SQLAlchemy的使用方法 config.py。 阅读详情

相关推荐

【Flask】什么是Flask-SQLAlchemy?

目录 ORM: SQLAlchemy: Flask-SQLAlchemy: 安装及配置: Flask-SQLAlchemy对数据库的操作: 在认识Flask-SQLAlchemy之前,先要了解ORM和SQLAlchemy。 ORM: 概念 ORM:对象关系映射,英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping) 产生背景:...

高岩 is me 859

flask-sqlalchemy扩展

1. 基本使用 1.1 扩展介绍 1.1.1 认识flask-sqlalchemy Flask-SQLAlchemy是一个为Flask应用增加***SQLAlchemy***支持的扩展。它致力于简化在Flask中***SQLAlchemy***的使用 SQLAlchemy***是目前python最强大的***ORM框架,功能全面,使用简单 ORM优缺点 优点 有语法提示,省去自己拼写SQL,保证语法的正确性 orm提供方言功能(dialect,可以转化为多种数据库的语法),减少学习成本 面向对象,可

weixin_46072106的博客 1978

Python3中Flask使用flask_sqlalchemy的的问题以及解决

(一) Python3在flask_sqlalchemy中相比改动了一些比如模块的导入。 在Python2中应该是 from flask.ext.sqlalchemy impot SQLAlchemy 虽然在Python3中这样使用其实不会错但是Python3中不赞成这样使用可能在未来会取消flask.ext.sqlalchemy这是个趋势 在Python3中建议使用from flask_

Kompany4的博客 1万+

【Flask】SQLAlchemy

本专栏介绍了SQLAlchemy库在flask上的orm操作

al6nlee的博客 7781

(三十四)Flask之SQLAlchemy

(三十四)Flask之SQLAlchemy

孤寒者的博客 1万+

SQLAlchemy 和 Flask-SQLAlchemy 的连接配置和使用详解

而 Flask-SQLAlchemy 是在 SQLAlchemy 基础上针对 Flask 框架进行的封装,使得在 Flask 应用中使用 SQLAlchemy 更加简单和高效。希望本文对你有所帮助!在使用 SQLAlchemy 和 Flask-SQLAlchemy 之前,我们需要配置数据库连接。通过定义模型类,我们可以使用 SQLAlchemy 提供的 API 进行数据库操作,如插入、查询、更新和删除等。在本文中,我们将详细介绍如何配置和使用 SQLAlchemy 和 Flask-SQLAlchemy。

WqxEditor的博客 482

Flask-SQLAlchemy

认识Flask-SQLAlchemy Flask-SQLAlchemy 是一个为 Flask 应用增加 SQLAlchemy 支持的扩展。它致力于简化在 Flask 中 SQLAlchemy 的使用。 SQLAlchemy 是目前python中最强大的 ORM框架, 功能全面, 使用简单。 ORM优缺点 优点 有语法提示, 省去自己拼写SQL,保证SQL语法的正确性 orm提供方言功能(dialect, 可以转换为多种数据库的语法), 减少学习成本 防止sql注入攻击 搭配数据迁移, 更新数据库方便

weixin_47906106的博客 3万+

音乐频谱灯的硬件艺术:从STM32到SK9822LED的工程美学

本文探讨了基于STM32微控制器和SK9822 LED的音乐频谱灯硬件设计与实现。通过ADC采集音频信号,利用FFT算法进行频谱分析,并驱动LED阵列呈现动态视觉效果,展现了硬件工程与艺术美学的完美融合。

Pepper的专栏 217

Flask 之 flask-SQLAlchemy 的使用

一、Flask-SQLAlchemy 配置与基本使用 1.1、配置键 Flask-SQLAlchemy 扩展能够识别的配置键的清单:SQLAlchemy 操作数据库的ORM组件 SQLALCHEMY_DATABASE_URI 用于连接数据的数据库。例如: sqlite:////tmp/test.db mysql://username:password@serve...

爱人BT的博客 1万+

光模块的封装工艺有哪些?

COB封装传统的单路10Gb/s或25Gb/s速率的光模块采用SFP封装将电芯片和TO封装的光收发组件焊接到PCB板上组成光模块。但对于40G及以上速率的高速光模块,受激光器速率限制(多为25G),主要通过多通道并行实现,如40G由4×10G实现,而100G则由4×25G实现。蝶形封装:壳体通常为长方体,结构及实现功能通常比较复杂,可以内置制冷器、热沉、陶瓷基块、芯片、热敏电阻、背光监控,并且可以支持所有以上部件的键合引线。BOX封装属于蝶形封装的一种,用于多通道并行封装。

WaytoICT- Explore ICT Technology, Build Your Tech Path 3810

Abaqus小白必看:用Micromechanics Plugin轻松搞定RVE周期性边界条件(附避坑指南)

本文为Abaqus初学者提供了使用官方Micromechanics Plugin插件高效实现复合材料代表性体积单元分析的完整指南。文章详细讲解了从插件安装、模型准备、周期性边界条件自动设置到结果验证的全流程,并重点分享了处理复杂模型和避免常见错误的实用技巧,帮助用户大幅提升RVE分析效率与准确性。

weixin_28363123的博客 798

Python SQLAlchemy 如何与 Flask 集成

SQLAlchemy 是 Python 中最流行的 ORM 库之一,它能够让开发者通过编写 Python 代码,而不是直接编写 SQL 语句来操作数据库。SQLAlchemy 的核心概念是通过模型类来表示数据库表,使用 Python 的对象来操作数据库中的记录。虽然 SQLAlchemy 本身可以独立于 Flask 使用,但为了与 Flask 更好地集成,社区提供了一个扩展库,这个扩展封装了 SQLAlchemy,简化了它在 Flask 中的配置和使用,使得 Flask 应用更容易与数据库交互。在。

chusheng1840的博客 1260

告别CAPL编程!用Matlab/Simulink+CANoe实现复杂ECU仿真的5个技巧

本文介绍了如何利用Matlab/Simulink与CANoe进行联合仿真,以替代复杂的CAPL编程,高效实现复杂ECU仿真。文章分享了5个核心技巧,涵盖信号映射、模型编译集成、实时参数调整、性能优化及数据分析,帮助算法工程师构建稳定强大的仿真环境,显著提升开发与测试效率。

rgv234567的博客 296

Flask-SQLAlchemy 组件

字段类型Integer 普通整数,一般是32位SmallInteger 取值范围小的整数,一般是16位BigInteger 不限制精度的整数Float 浮点数Numeric 普通整数,一般是32位String 变长字符串Text 变长字符串,对较长或不限长度的字符串做了优化JSON JSON 数据Unicode 变长 Unicode 字符串UnicodeText 变长 Unicode 字符串,对较长或不限长度的字符串做了优化Boolean 布尔值。

longe20111104的博客 1947

VLA模型(具身智能入门十)

Vision Language Action(VLA)模型VLA模型是机器人领域的“感知-理解-执行”一体化框架,通过Transformer架构融合视觉、语言、动作模态,核心目标是让机器人在自然语言驱动下,自主完成复杂操控任务。其定义的核心在于“跨模态统一”与“具象化行动”——不仅能“看懂”“听懂”,更能“做出正确的动作”,是实现通用机器人智能的关键方向。提供通用序列建模骨架,让视觉、语言、动作能以“序列”形式统一处理;ViT将视觉输入转换为序列特征,提供“看”的能力;LLMs。

weixin_39699362的博客 9928

14003.xilinx系统移植

文章目录1 xilinx 系统移植 sd卡版本1.1 创建项目1.2 拷贝 *.hdf 到工程目录1.3 根据hdf文件对系统进行配置1.3.1 设置内核源码路径为本地1.3.2 设置分区的名称与大小1.4 清除本地缓存并编译成功1.5 打包生成BOOT.BIN并拷贝到sd卡1.6 问题1.7 系统启动成功1.8 配置设备树文件丰富系统外设 1 xilinx 系统移植 sd卡版本 芯片型号 ZYNQ UltraScale+ XAZU2EG ,对应厂家提供的demo板为 zu102或zu104 1.1 创建

写给自己的笔记 482

Flask之SQLAlchemy

Flask之SQLAlchemy 简介 SQLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射(ORM)工具,使用MIT许可证发行。 SQLAlchemy“采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型”。 SQLAlchemy首次发行于2006年2月,并迅速地在Python社区中最广泛使用的ORM工具之一,不亚于D...

weixin_45439324的博客 1408

【LaTex】3.4 立体几何

本文介绍了使用LaTeX的tikz包绘制立体几何图形的两种方法。首先展示了基础立方体的绘制代码,通过定义8个顶点坐标并连接各边完成绘制。接着讲解了scope功能在3D绘图中的应用,包括标准平面(xy、xz、yz)的绘制方法,以及任意平面的定义技巧。重点说明了如何通过定义平面原点、x和y方向单位向量来创建旋转后的绘图平面,并以45°旋转的yz平面为例演示了圆的绘制。文章提供了完整的代码示例和对应的效果图示,展示了tikz在3D绘图中的灵活性和强大功能。

你的指尖有改变世界的力量 2456

flask连接数据库——flask-SQLALchemy

SQLALchemy介绍: sqlalchemy是数据库的orm框架,让我们操作数据库的时候不要再用sql语句了,跟直接操作模型一样。 请求钩子: 在请求开始时,建立数据库连接; 在请求开始时,根据需求进行权限校验; 在请求结束时,指定数据的交互格式; @app.before_first_request #只有第一次请求之前调用,可以在此方法内部做一些初始化操作 @app.before_request #每次请求之前都会触发 #在每一次请求之前调用,这时候已经有请求了,可能在这个方法里面做请求的校验

weixin_46549605的博客 1万+

微信小程序 - 实现嵌套H5页面唤起微信支付的实现方案+完整流程源码,微信小程序webview(H5页面)调用微信小程序支付,嵌套h5页面怎么实现小程序支付(Vue2/3移动端H5网页、公众号网页等)

h5嵌入微信小程序微信支付,H5网页嵌入到微信小程序内如何支付,微信小程序webview组件交互,内联h5页面并网页实现微信支付,微信H5页面实现微信小程序支付,微信小程序嵌套webview实现小程序微信支付,小程序中内嵌H5网页支付怎么办,用网页的支付还是小程序的支付?支付没反应,支付报错怎么办,微信小程序内嵌h5,h5调用小程序支付功能解决方案,H5网页cors跨域,真机测试无法唤起支付,无法唤起支付,uniapp微信小程序,h5小程序调用微信支付,微信小程序内嵌H5页面,如何实现微信支付功能,微信小程

🏆 前端领域优质创作者 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

sqlalchemy与flask-sqlalchemy的区别

sqlalchemy与flask-sqlalchemy的区别

学习笔记,不喜勿喷! 416

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Flask-SQLAlchemy:在Flask应用中优雅地操作数据库

SQLAlchemy是一个强大的Python SQL工具包,它提供了一套完整的企业级持久化模式,用于将数据库操作抽象为Python代码。它允许我们使用面向对象的方式来操作数据库,而不必编写繁琐的SQL语句。SQLAlchemy支持多种数据库,包括MySQL、PostgreSQL、SQLite等,这使得我们在切换数据库时只需修改少量配置,而无需更改大量的代码。在Flask-SQLAlchemy中,我们使用Python类来定义数据库表的结构,这些类被称为模型类。

zhangkexin_z的博客 4869

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: Flask 之 Jinjia2 模板引擎必知必会
下一篇: 机器学习中常用的性能度量—— ROC 和 AUC
沉住气CD
博客等级 码龄9年 547粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值