Flask-SQLAlchemy的使用【二】

目录

一.查询

1.1查询语句的格式

1.2查询过滤器

 1.3查询执行器

 1.4具体例子

1.4.1查询有多少个用户

1.4.2查询第一个用户

1.4.3查询id为4的用户

1.4.4查询id为4title为4的记录

1.4.5查询id为4或者title为4的记录

1.4.6查询id为[1,3,5,7,9]的记录

1.4.7查询所有记录,并以create_time排序

二.多py文件搭建Flask程序

2.1为什么要多py文件

2.2分离py文件

三.其它指令

3.1查询模型对象的所有属性

3.2获取模型对象的属性值

一.查询

flask-sqlalchemy的查询有两种方式:“使用ORM(execute)查询【2.0以后的新方法】”、“使用模型类.query查询【1.0的旧方法】

尽管如此,作者本人仍习惯使用query查询方法,原因在于书写简单方便,缺点在于没有打印调试信息,本篇将使用query介绍查询,关于ORM查询可以参考官方文档

1.1查询语句的格式

使用“模型类.query”的查询语句一般格式为:“模型类.query.查询过滤器.查询执行器

结果返回一个model模型对象

1.2查询过滤器

  • filter():复杂过滤器,可以是函数表达式等
  • filter_by():等值过滤器
  • limit:限定返回结果的数量
  • offset():偏移查询
  • order_by():对查询结果排序
  • group_by():对查询结果分组

 1.3查询执行器

  • all():以列表形式返回所有结果,结果为model对象
  • first():返回查询到的第一个结果,如果未查到返回None
  • first_or_404():查询第一个结果,如果未查到返回404
  • get():返回指定主键对应的model对象,不存在返回None
  • get_or_404():返回逐渐对应的model对象,不存在返回404
  • count():返回查询结果的数量

 1.4具体例子

下面的例子都将以该模型代码为例:

from flask import *
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
app.config.from_object("config")
db = SQLAlchemy(app)@app.route("/")
def index():return "666"class Blog(db.Model):#设置表名__tablename__ = 'blog'id = db.Column(db.Integer,primary_key=True,autoincrement=True)title = db.Column(db.String(128))text = db.Column(db.TEXT)create_time = db.Column(db.String(64))#关联用户idif __name__ == "__main__":app.run(debug=True)

该表中的数据为

1.4.1查询有多少个用户

count = Blog.query.count()
print("表中记录数为:",count)

结果:

1.4.2查询第一个用户

count = Blog.query.first()
print("表中记录为:",count)

结果:

1.4.3查询id为4的用户

三种方式:

Blog.query.filter_by(id=4).first()
Blog.query.filter(Blog.id == 4).first()
Blog.query.get(4).first()

1.4.4查询id为4title为4的记录

两种方法:

from sqlalchemy import and_
Blog.query.filter(Blog.id == 4,Blog.title == 4).first()
Blog.query.filter(and_(Blog.id == 4,Blog.title == 4))

1.4.5查询id为4或者title为4的记录

from sqlalchemy import or_
Blog.query.filter(or_(Blog.id == 4,Blog.title == 4))

1.4.6查询id为[1,3,5,7,9]的记录

from sqlalchemy import in_
Blog.query.filter(Blog.id.in_([1,3,5,7,9])).all()

1.4.7查询所有记录,并以create_time排序

Blog.query.order_by(Blog.create_time).all()
Blog.query.order_by(Blog.create_time.desc()).all()

二.多py文件搭建Flask程序

2.1为什么要多py文件

在实际生产中,我们可能会有多个model模型、多个数据库连接等等,此时为方便开发与维护,我们可能会将Flask程序逻辑与数据库逻辑分离开,使它们在不同的py文件中

但是如果小白第一次尝试分离py文件,可能会产生诸多问题:“循环导入”、“上下文问题

在这里,作者给出一种相对稳定且可以适应复杂环境的分离方式:

2.2分离py文件

我们将Flask逻辑保留在“app.py”文件中,将flask-alchemy逻辑保留在“model.py”文件中,此时只需要在app.py文件中“导入model.py”再将“db对象与app对象关联”即可

后续其它py文件想要使用数据库,可以直接“导入model.py”后使用db对象,而此时的db对象已经与app程序关联可以直接使用,或者重新关联一个app程序(注意此时一旦更换关联app对象,那么其它py文件使用的db对象也会发生改变!!这是十分危险的!!建议重新创建一个db对象!!)

下面是作者的一个示例“app.py”文件:

import secrets
from flask import *app = Flask(__name__)
# app的一些配置
app.config.from_object('config')
app.secret_key = secrets.token_hex(16)# 注册蓝图
from view import *
app.register_blueprint(index)
app.register_blueprint(blog)#导入数据库模型
from model import *
#将db数据库示例与app程序绑定
db.init_app(app)if __name__ == '__main__':app.run(debug=True)

而“model.py”文件如下:

#表-实体类
from flask_sqlalchemy import SQLAlchemydb = SQLAlchemy()#作品类
class Blog(db.Model):#设置表名__tablename__ = 'blog'id = db.Column(db.Integer,primary_key=True,autoincrement=True)title = db.Column(db.String(128))text = db.Column(db.TEXT)create_time = db.Column(db.String(64))#关联用户id#建表
def create():db.create_all()#删表
def drop():dp.drop_all()

注意到:“在app.py文件引入model.py文件后,我们需要将model.py文件中的db对象与app对象关联,我们使用了app_init()方法关联

ps:“from model import *”这条语句可以移动到开头,此时并不会影响程序,但是app_init()语句必须在app对象“创建并完成配置”后再关联,作者将两者写在一起是为了思维上更符合逻辑

三.其它指令

3.1查询模型对象的所有属性

我们可以使用模型对象的“__table__.columns”来查看对象的所有属性:

blog = Blog.query.first()
print(blog.__table__.columns)

效果:

3.2获取模型对象的属性值

获取属性相对简单,有两种方式:“模型.属性名”、“getattr(模型,属性名)

blog = Blog.query.first()
print(blog.id)
print(getattr(blog,"id"))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/330917.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无人机助力光伏项目测绘建模

随着全球对可再生能源需求的不断增长,光伏项目作为其中的重要一环,其建设规模和速度都在不断提高。在这一背景下,如何高效、准确地完成光伏项目的测绘与建模工作,成为了行业发展的重要课题。近年来,无人机技术的快速发…

汇聚荣科技有限公司优点有哪些?

在当今快速发展的科技时代,企业之间的竞争愈发激烈。作为一家专注于科技创新与研发的公司,汇聚荣科技有限公司凭借其卓越的技术实力和创新能力,在业界树立了良好的口碑。那么,汇聚荣科技有限公司究竟有哪些优点呢?接下来&#xf…

WPF中MVVM架构学习笔记

MVVM架构是一种基于数据驱动的软件开发架构,它将数据模型(Model)、视图(View)和视图模型(ViewModel)三者进行分离,使得开发者可以更加专注于各自领域的开发。其中,Model负…

Add object from object library 从对象库中添加内置器件

Add object from object library 从对象库中添加内置器件 正文正文 对于 Lumerical,有些时候我们在使用中,可能需要从 Object library 中添加器件,通常我们的做法是手动添加。如下图所示,我们添加一个 Directional Coupler 到我们的工程文件中: 但是这种操作方式不够智能…

封装了一个iOS中间放大的collectionView layout

效果图如下所示 原理:就是首先确定一个放大和缩小系数和原大小对应的基准位置,然后根据距离每个布局属性到视图中心的距离和基准点到中心的距离的差距/基准点到中心的距离, 计算出每个布局属性的缩放系数 下面是代码 // // LBHorizontalCe…

基于AT89C52单片机的智能窗帘系统

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/89276984?spm1001.2014.3001.5503 C 源码仿真图毕业设计实物制作步骤07 智能窗户控制系统学院(部): 专 业: 班 级&…

springboot vue 开源 会员收银系统 (4) 门店模块开发

前言 完整版演示 前面我们对会员系统 springboot vue 开源 会员收银系统 (3) 会员管理的开发 实现了简单的会员添加 下面我们将从会员模块进行延伸 门店模块的开发 首先我们先分析一下常见门店的管理模式 常见的管理形式为总公司 - 区域管理(若干个门店&#xff…

论文精读-SwinIR Image Restoration Using Swin Transformer

论文精读-SwinIR: Image Restoration Using Swin Transformer SwinIR:使用 Swin Transformer进行图像恢复 参数量:SR 11.8M、JPEG压缩伪影 11.5M、去噪 12.0M 优点:1、提出了新的网络结构。它采用分块设计。包括浅层特征提取:cnn提取&#…

【C++】C++11(一)

C11是一次里程碑式的更新,我们一起来看一看~ 目录 列表初始化:{ }初始化:std::initializer_list: 声明:auto:decltype: STL的一些变化: 列表初始化: { }初始化&#xf…

JavaSE——类和对象(二)~~封装

目录 一.封装 二.封装扩展之包 三.static成员 四. 代码块 五. 内部类(重要) 大家好呀,我是北纬,接着上节我们继续讲解Java中关于类和对象的相关知识,今天着重给大家介绍一下关于面向对象程序的特性之一——封装。…

最新php项目加密源码

压缩包里有多少个php就会被加密多少个PHP、php无需安装任何插件。源码全开源 如果上传的压缩包里有子文件夹(子文件夹里的php文件也会被加密),加密后的压缩包需要先修复一下,步骤:打开压缩包 》 工具 》 修复压缩文件…

STM32——IIC篇

技术笔记! 一、IIC总线协议介绍(掌握) 1.1 IIC总线结构图 1.2 IIC协议时序 1.3 硬件和软件IIC对比 二、AT24C02介绍(了解) 2.1 AT24C02通讯地址 三、AT24C02读写时序(掌握) 3.1 写时序 3.…

有趣的css - 移形换位加载动画

大家好,我是 Just,这里是「设计师工作日常」,今天分享的是一个移形换位动态加载小动效,适用于 app 列表加载,页面加载或者图片懒加载等场景。 最新文章通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html…

Ubuntu22.04本地部署qwen模型、jupyterlab开发环境、LoRA微调全流程

前言 这段时间在自己的Win11系统上部署了chatGLM以及Qwen模型,进行对话、推理以及工具调用都没有问题,但是在尝试进行微调的时候发现好像并不能成功,因此花费了很大的力气,又分别在ubuntu桌面版、windows子系统WSL2 Ubuntu上部署…

数据可视化第9天(利用wordcloud和jieba分析蝙蝠侠评论的关键字)

数据可以在这里下载 https://github.com/harkbox/DataAnalyseStudy WordCloud wordcloud可以很方便的生成词云图,方便的提供可视化可以直接使用pip install wordcloud进行安装如果使用的是Anaconda,可以使用conda install进行安装 下面看一个简单的例子 txt &qu…

JVM学习-堆空间(三)

JVM在进行GC时,并非每次都对新生代、老年代、方法区(元空间)三个区域一起回收,大部分时间回收的都是新生代 针对Hotspot VM的实现,它里面的GC按照回收区域分两大类型:一种是部分收集(Partial GC),一种是整堆收集(Full …

amtlib.dll打不开怎么办?一键修复丢失amtlib.dll方法

电脑丢失amtlib.dll文件是什么情况?出现amtlib.dll打不开怎么办?这样的情况有什么解决方法呢?今天就和大家聊聊amtlib.dll文件同时教大家一键修复丢失amtlib.dll方法?一起来看看amtlib.dll文件丢失会有哪些方法修复? a…

Docker配置国内镜像源

添加Docker国内镜像源 在/etc/docker/daemon.json文件中添加以下内容: {"registry-mirrors": ["http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https://registry.docker-cn.com"] }重启docker s…

【Python】—— lambda表达式

目录 (一)应用场景 (二)lambda 语法 (三)示例分析 (四)lambda参数形式 4.1 无参数 4.2 一个参数 4.3 默认参数 4.4 可变参数 :*args 4.5 可变参数 :…

第四十一天 | 62.不同路径 63.不同路径|| 343.整数拆分 96.不同的二叉搜索树

题目:62.不同路径 1.二维dp数组dp[i][j]含义:到达(i,j)位置有dp[i][j]种方法。 2.动态转移方程:dp[i][j] dp[i - 1][j] dp[i][j - 1] 3.初始化:dp[0][j] 1, dp[i][0] 1 (第一…