Flask-SQLAlchemy 组件
一、ORM
要了解 ORM 首先了解以下概念。
-
什么是持久化
持久化 (Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML 数据文件中等等。 -
什么是持久层
持久层 (Persistence Layer),即专注于实现数据持久化应用领域的某个特定系统的一个逻辑层面,将数据使用者和数据实体相关联。 -
什么是 ORM
ORM(Object Relation Mapping),对象关系映射。主要实现模型对象到关系数据库数据的映射。
优点:
只需要面向对象编程,统一风格,不需要使用 SQL 语言。
实现数据模型和数据库的解藕,及不用关心是什么数据库,更改简单配置即可更换数据库。
缺点:
有部分性能损耗
二、SQLAlchemy
SQLAlchemy 是 Python 语言开发的 ORM 框架,是 ORM 具体实现的实例。
SQLAlchemy中文文档:https://www.osgeo.cn/sqlalchemy/
三、Flask-SQLAlchemy
Flask-SQLAlchemy 是基于 SQLAlchemy 进行高度封装、简化,适用于 Flask 矿建的 Flask 组件。
Flask-SQLAlchemy 中文文档:http://www.pythondoc.com/flask-sqlalchemy/
四、基本配置
- 安装 flask_sqlalchemy
pip install flask_sqlalchemy - 连接 MySQL 数据库
SQLALCHEMY_DATABASE_URI = ‘mysql://root:g3nt00567@127.0.0.1:3306/vnet_user_dev’
默认情况下,MySQL 使用的是 mysqlclient 驱动。当然也可以使用其他驱动,如:mysqldb、pymysql 等。
SQLALCHEMY_DATABASE_URI = ‘mysql+mysqldb://root:g3nt00567@127.0.0.1:3306/vnet_user_dev’
SQLALCHEMY_DATABASE_URI = ‘mysql+pymysql://root:g3nt00567@127.0.0.1:3306/vnet_user_dev’
3. 连接其他数据库
oracle
SQLALCHEMY_DATABASE_URI = ‘oracle://root:g3nt00567@127.0.0.1:3306/vnet_user_dev’
mssql
SQLALCHEMY_DATABASE_URI = ‘mssql://root:g3nt00567@127.0.0.1:3306/vnet_user_dev’
sqlite
SQLALCHEMY_DATABASE_URI = ‘sqlite:tmp/test.db’
redis
REDIS_URL = ‘redis://127.0.0.1:6379/1’
4. 其他配置
输出原始 SQL
SQLALCHEMY_ECHO = False
数据库连接池的大小
SQLALCHEMY_POOL_SIZE = 1000
动态追踪修改设置
SQLALCHEMY_TRACK_MODIFICATIONS = False
更多配置请参考官方链接:http://www.pythondoc.com/flask-sqlalchemy/config.html
五、模型定义
- 字段类型
Integer 普通整数,一般是32位
SmallInteger 取值范围小的整数,一般是16位
BigInteger 不限制精度的整数
Float 浮点数
Numeric 普通整数,一般是32位
String 变长字符串
Text 变长字符串,对较长或不限长度的字符串做了优化
JSON JSON 数据
Unicode 变长 Unicode 字符串
UnicodeText 变长 Unicode 字符串,对较长或不限长度的字符串做了优化
Boolean 布尔值
Date 日期
Time 时间
DateTime 日期和时间
LargeBinary 二进制文件 - 类型属性
primary_key 如果为True,代表表的主键
unique 如果为True,代表这列不允许出现重复的值
index 如果为True,为这列创建索引,提高查询效率
nullable 如果为True,允许有空值,如果为 False,不允许有空值
default 为这列定义默认值 - 示例代码
demo.py
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-from app import db
from app.lib.datetimeLib import dt# 用户表
class Users(db.Model):__tablename__ = 'users'# idid = db.Column(db.BigInteger, primary_key=True, autoincrement=True)# 电话phone = db.Column(db.String(11), unique=True, index=True)# 邮箱mail = db.Column(db.String(64), nullable=True, default=None)# 用户username = db.Column(db.String(128), nullable=True, default=None)# 密码password = db.Column(db.String(128), nullable=False)# tokentoken = db.Column(db.String(256), unique=True)# 盐值salt = db.Column(db.String(32), nullable=False)# 用户状态status = db.Column(db.Integer, nullable=False, default=True)# 创建时间create_time = db.Column(db.DateTime, default=dt.datetime_orm)# 修改时间update_time = db.Column(db.DateTime, default=dt.datetime_orm, onupdate=dt.datetime_orm)# 乐观锁version = db.Column(db.BigInteger, nullable=False)__mapper_args__ = {"version_id_col": version}def __repr__(self):return "<User (%s)>" % self.id
六、模型操作
1. 过滤器
filter() 把过滤器添加到原查询上,返回一个新查询
filter_by() 把等值过滤器添加到原查询上,返回一个新查询
limit() 使用指定的值限定原查询返回的结果
offset() 偏移原查询返回的结果,返回一个新查询
order_by() 根据指定条件对原查询结果进行排序,返回一个新查询
group_by() 根据指定条件对原查询结果进行分组,返回一个新查询
2. 执行器
all() 以列表形式返回查询的所有结果
first() 返回查询的第一个结果,如果未查到,返回 None
get() 返回指定主键对应的行,如不存在,返回 None
count() 返回查询结果的数量
paginate() 返回一个 Paginate 对象,它包含指定范围内的结果
3. 新增
user = Users(username=username, password=password)
db.session.add(user)
db.session.commit()
先将对象添加到数据库的会话中,然后在提交到数据库,具体细节请参考对应的数据库。
如果,我们想立即返回刚刚新建数据的 id 该如何实现呢?其实也有简单的方法,通过 flush 即可。
db.session.add(user)
db.session.flush()
user_id = user.id
db.session.commit()
在提交之前,预先将任何剩余的状态刷新到数据库,这样数据库是不可见的,但是数据已经存在了,等拿到 id 之后再提交。
4. 删除
删除记录是十分类似的,使用 delete() 实现删除功能。
db.session.delete(user)
db.session.commit()
5. 修改
user = Users.query.get(1)
user.username = ‘new user’
db.session.commit()
6. 查询
查询所有用户数据
Users.query.all()
查询有多少个用户
Users.query.count()
查询第一个用户
Users.query.first()
查询 id 为 1 的用户
Users.query.get(1)
Users.query.filter(Users.id == 1).first()
Users.query.filter_by(id=1).first()
查询名字结尾字符为 vnet 的所有数据
Users.query.filter(Users.name.endswith(‘vnet’)).all()
查询名字开始字符为 vnet 的所有数据
Users.query.filter(Users.name.startswith(‘vnet’)).all()
查询名字包含字符为 vnet 的所有数据
Users.query.filter(Users.name.contains(‘vnet’)).all()
查询名字不等于 vnet 的所有数据
Users.query.filter(not_(Users.name == ‘vnet’)).all()
Users.query.filter(Users.name != ‘vnet’).all()
查询名字和邮箱都以 vnet 开头的所有数据
Users.query.filter(and_(Users.name.startswith(‘vnet’), Users.email.startswith(“li”))).all() Users.query.filter(Users.name.startswith(‘vnet’), Users.email.startswith(‘vnet’)).all()
查询 id 为 [1, 3, 5, 7, 9] 的用户列表
Users.query.filter(Users.id.in_([1, 3, 5, 7, 9])).all()
查询所有用户数据,并以邮箱正序排序
Users.query.order_by(Users.email).all()
查询所有用户数据,并以邮箱倒序排序
Users.query.order_by(Users.email.desc()).all()
查询指定每页 3 条,属于第 2 页的数据
Users.query.paginate(2, 3, False).items
主键查询
Users.query.get(1)
精确查询
Users.query.filter_by(name=‘vnet’).all()
模糊查询
Users.query.filter(Users.name.contains(‘vnet’)).all()
返回查询到第一个对象
Users.query.filter_by(name=‘vnet’).first()
返回查询到所有的对象
Users.query.filter_by(name=‘vnet’).all()
逻辑非查询
Users.query.filter(Users.name!=‘vnet’).all()
逻辑与查询
from sqlalchemy import and_
Users.query.filter(and_(Users.name!=‘vnet’, Users.email.endswith(‘163.com’))).all()
逻辑或查询
from sqlalchemy import or_
Users.query.filter(or_(Users.name!=‘vnet’, Users.email.endswith(‘163.com’))).all()
取反查询
from sqlalchemy import not_
Users.query.filter(not_(Users.name==‘vnet’)).all()
原生 SQL
data = list(db.session.execute(sql))
函数
from sqlalchemy import func
users = Users.query.filter(func.find_in_set(id, id_set).all()
排序
from sqlalchemy import desc, asc
users = Users.query.order_by(desc(‘id’)).filter(*)
相关文章:
Flask-SQLAlchemy 组件
一、ORM 要了解 ORM 首先了解以下概念。 什么是持久化 持久化 (Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,…...
Could not retrieve mirrorlist http://mirrorlist.centos.org错误解决方法
文章目录 背景解决方法 背景 今天在一台新服务器上安装nginx,在这个过程中需要安装相关依赖,在使用yum install命令时,发生了以下报错内容: Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&archx8…...
最新PHP网盘搜索引擎系统源码 附教程
最新PHP网盘搜索引擎系统源码 附教程,这是一个基于thinkphp5.1MySQL开发的网盘搜索引擎,可以批量导入各大网盘链接,例如百度网盘、阿里云盘、夸克网盘等。 功能特点:网盘失效检测,后台管理功能,网盘链接管…...
SpringBoot面试热题
1.Spring IOC(控制反转)和AOP(面相切面编程)的理解 控制反转意味着将对象的控制权从代码中转移到Spring IOC容器。 本来是我们自己手动new出来的对象,现在则把对象交给Spring的IOC容器管理,IOC容器作为一个对象工厂,管理对象的创建和依赖关系…...
ASP.NET Core8.0学习笔记(二十三)——EF Core自引用
一、什么是自引用 1.在常见的树状目录中,其结构如下: 每一个菜单可能有父级菜单,也可能有子菜单。但是无论是哪一级菜单,他们都是同属于菜单对象。将这个菜单对象使用代码进行描述: 在上面的代码中,主…...
springboot童装销售管理系统-计算机毕业设计源码92685
摘 要 童装销售管理系统是为童装店商家提供的在线销售管理系统,本系统的研发设计能够增加童装店商家的童装宣传和推广,提升客流量和订单量,增加商家的营业收益。原有的童装品销售系统管理采用手工管理的方式,各种童装品宣传和订单…...
OpenCV中的图像通道合并
在计算机视觉和图像处理领域,OpenCV是一个强大的工具库,它提供了从基本操作到复杂算法的广泛功能。今天,我们将通过一个简单的示例来探索OpenCV中的图像通道处理,特别是如何操作和理解BGR与RGB颜色空间的差异。 Lena图像…...
Flutter TextField和Button组件开发登录页面案例
In this section, we’ll go through building a basic login screen using the Button and TextField widgets. We’ll follow a step-bystep approach, allowing you to code along and understand each part of the process. Let’s get started! 在本节中,我们…...
【vue + mockjs】Mockjs——数据接口模拟
一、mockjs 根据规则生成随机数据,通过拦截 ajax 请求来实现"模拟前端数据接口“的作用。 二、安装 // yarn yarn add mockjs// npm npm install mockjs --save-dev 三、主要模块 mock 根据数据模板生成对应的随机数据Random 工具函数, 调用具体的类型函数…...
ssm订餐系统-计算机毕业设计源码26763
摘 要 本文提出了基于SSM框架的订餐系统的设计与实现。该系统通过前后端分离的方式,采用SpringMVCSpringMyBatis(SSM)框架进行开发,实现了用户注册、登录、点餐、购物车、订单管理等功能。系统设计了用户注册模块,用户…...
4.2-7 运行MR应用:词频统计
文章目录 1. 准备数据文件2. 文件上传到HDFS指定目录2.1 创建HDFS目录2.2 上传文件到HDFS2.3 查看上传的文件 3. 运行词频统计程序的jar包3.1 查看Hadoop自带示例jar包3.2 运行示例jar包里的词频统计 4. 查看词频统计结果5. 在HDFS集群UI界面查看结果文件6. 在YARN集群UI界面查…...
查看Chrome安装路
谷歌Google浏览器查看安装路径,浏览器Google Chrome浏览器查看安装路径 chrome://version/ 来源:笔记云...
深入剖析Canvas的getBoundingClientRect:精准定位与交互事件实现
软考鸭微信小程序 过软考,来软考鸭! 提供软考免费软考讲解视频、题库、软考试题、软考模考、软考查分、软考咨询等服务 在前端开发中,Canvas是一个强大的绘图工具,它允许开发者在网页上动态地绘制图形、图像和动画。然而,仅仅能够绘制图形是不…...
SQL SERVER 2005/2008/2012/2016/2020 数据库状态为“可疑”的解决方法(亲测可用)
当数据库发生这种操作故障时,可以按如下操作步骤可解决此方法,打开数据库里的Sql 查询编辑器窗口,运行以下的命令。 1、修改数据库为紧急模式 ALTER DATABASE demo SET EMERGENCY 2、使数据库变为单用户模式 ALTER DATABASE demo SET SINGL…...
Linux: network: wireshark IO图的一个问题
今天遇到一个问题,发现wireshark画的IO图,前几秒没有数据,但是根据Raw的pcap看,是有包的,这就迷惑了。 经同事提醒,这个IO在设置了多个画图filter的时候,可能导致开始前几秒没有输出。如下图 这…...
TMGM平台可靠么?交易是否安全?
在选择外汇交易平台时,安全性与可靠性是投资者最关注的要素之一。作为全球知名的外汇及差价合约交易平台,TMGM(tmgm-pt.com)的安全性与可靠性可以从多个方面进行评估,包括监管环境、资金安全、客户服务、交易技术与服务…...
软工毕设开题建议
文章目录 🚩 1 前言1.1 选题注意事项1.1.1 难度怎么把控?1.1.2 题目名称怎么取? 1.2 开题选题推荐1.2.1 起因1.2.2 核心- 如何避坑(重中之重)1.2.3 怎么办呢? 🚩2 选题概览🚩 3 项目概览题目1 : 深度学习社…...
Python自动化发票处理:使用Pytesseract和Pandas从图像中提取信息并保存到Excel
1. 引言 在财务部门,处理大量的纸质或扫描版发票是一项既耗时又容易出错的任务。通过使用Python中的pytesseract(一个OCR工具)和pandas库,我们可以自动化这一过程,从而提高工作效率并减少错误。 2. 安装所需库 首先…...
新手直播方案
简介 新手直播方案 ,低成本方案 手机/电脑 直接直播手机软件电脑直播手机采集卡麦电脑直播多摄像机 机位多路采集卡 多路麦加电脑(高成本方案) 直播推流方案 需要摄像头 方案一 :手机 电脑同步下载 网络摄像头 软件(…...
【大模型理论篇】主流大模型的分词器选择及讨论(BPE/BBPE/WordPiece/Unigram)
1. 背景分析 分词是将输入和输出文本拆分成更小单位的过程,使得大模型能够处理。token可以是单词、字符、子词或符号,取决于模型的类型和大小。分词可以帮助模型处理不同的语言、词汇和格式,并降低计算和内存成本。分词还可以通过影响token的…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...
