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的…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
