当前位置: 首页 > news >正文

Flask-SQLAlchemy 组件

一、ORM

要了解 ORM 首先了解以下概念。

  1. 什么是持久化
    持久化 (Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML 数据文件中等等。

  2. 什么是持久层
    持久层 (Persistence Layer),即专注于实现数据持久化应用领域的某个特定系统的一个逻辑层面,将数据使用者和数据实体相关联。

  3. 什么是 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/

四、基本配置

  1. 安装 flask_sqlalchemy
    pip install flask_sqlalchemy
  2. 连接 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

五、模型定义

  1. 字段类型
    Integer 普通整数,一般是32位
    SmallInteger 取值范围小的整数,一般是16位
    BigInteger 不限制精度的整数
    Float 浮点数
    Numeric 普通整数,一般是32位
    String 变长字符串
    Text 变长字符串,对较长或不限长度的字符串做了优化
    JSON JSON 数据
    Unicode 变长 Unicode 字符串
    UnicodeText 变长 Unicode 字符串,对较长或不限长度的字符串做了优化
    Boolean 布尔值
    Date 日期
    Time 时间
    DateTime 日期和时间
    LargeBinary 二进制文件
  2. 类型属性
    primary_key 如果为True,代表表的主键
    unique 如果为True,代表这列不允许出现重复的值
    index 如果为True,为这列创建索引,提高查询效率
    nullable 如果为True,允许有空值,如果为 False,不允许有空值
    default 为这列定义默认值
  3. 示例代码
    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)&#xff0c;即把数据&#xff08;如内存中的对象&#xff09;保存到可永久保存的存储设备中&#xff08;如磁盘&#xff09;。持久化的主要应用是将内存中的数据存储在关系型的数据库中&#xff0c;…...

Could not retrieve mirrorlist http://mirrorlist.centos.org错误解决方法

文章目录 背景解决方法 背景 今天在一台新服务器上安装nginx&#xff0c;在这个过程中需要安装相关依赖&#xff0c;在使用yum install命令时&#xff0c;发生了以下报错内容&#xff1a; Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&archx8…...

最新PHP网盘搜索引擎系统源码 附教程

最新PHP网盘搜索引擎系统源码 附教程&#xff0c;这是一个基于thinkphp5.1MySQL开发的网盘搜索引擎&#xff0c;可以批量导入各大网盘链接&#xff0c;例如百度网盘、阿里云盘、夸克网盘等。 功能特点&#xff1a;网盘失效检测&#xff0c;后台管理功能&#xff0c;网盘链接管…...

SpringBoot面试热题

1.Spring IOC(控制反转)和AOP(面相切面编程)的理解 控制反转意味着将对象的控制权从代码中转移到Spring IOC容器。 本来是我们自己手动new出来的对象&#xff0c;现在则把对象交给Spring的IOC容器管理&#xff0c;IOC容器作为一个对象工厂&#xff0c;管理对象的创建和依赖关系…...

ASP.NET Core8.0学习笔记(二十三)——EF Core自引用

一、什么是自引用 1.在常见的树状目录中&#xff0c;其结构如下&#xff1a; 每一个菜单可能有父级菜单&#xff0c;也可能有子菜单。但是无论是哪一级菜单&#xff0c;他们都是同属于菜单对象。将这个菜单对象使用代码进行描述&#xff1a; 在上面的代码中&#xff0c;主…...

springboot童装销售管理系统-计算机毕业设计源码92685

摘 要 童装销售管理系统是为童装店商家提供的在线销售管理系统&#xff0c;本系统的研发设计能够增加童装店商家的童装宣传和推广&#xff0c;提升客流量和订单量&#xff0c;增加商家的营业收益。原有的童装品销售系统管理采用手工管理的方式&#xff0c;各种童装品宣传和订单…...

OpenCV中的图像通道合并

在计算机视觉和图像处理领域&#xff0c;OpenCV是一个强大的工具库&#xff0c;它提供了从基本操作到复杂算法的广泛功能。今天&#xff0c;我们将通过一个简单的示例来探索OpenCV中的图像通道处理&#xff0c;特别是如何操作和理解BGR与RGB颜色空间的差异。 Lena图像&#xf…...

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! 在本节中&#xff0c;我们…...

【vue + mockjs】Mockjs——数据接口模拟

一、mockjs 根据规则生成随机数据&#xff0c;通过拦截 ajax 请求来实现"模拟前端数据接口“的作用。 二、安装 // yarn yarn add mockjs// npm npm install mockjs --save-dev 三、主要模块 mock 根据数据模板生成对应的随机数据Random 工具函数, 调用具体的类型函数…...

ssm订餐系统-计算机毕业设计源码26763

摘 要 本文提出了基于SSM框架的订餐系统的设计与实现。该系统通过前后端分离的方式&#xff0c;采用SpringMVCSpringMyBatis&#xff08;SSM&#xff09;框架进行开发&#xff0c;实现了用户注册、登录、点餐、购物车、订单管理等功能。系统设计了用户注册模块&#xff0c;用户…...

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浏览器查看安装路径&#xff0c;浏览器Google Chrome浏览器查看安装路径 chrome://version/ 来源&#xff1a;笔记云...

深入剖析Canvas的getBoundingClientRect:精准定位与交互事件实现

软考鸭微信小程序 过软考,来软考鸭! 提供软考免费软考讲解视频、题库、软考试题、软考模考、软考查分、软考咨询等服务 在前端开发中&#xff0c;Canvas是一个强大的绘图工具&#xff0c;它允许开发者在网页上动态地绘制图形、图像和动画。然而&#xff0c;仅仅能够绘制图形是不…...

SQL SERVER 2005/2008/2012/2016/2020 数据库状态为“可疑”的解决方法(亲测可用)

当数据库发生这种操作故障时&#xff0c;可以按如下操作步骤可解决此方法&#xff0c;打开数据库里的Sql 查询编辑器窗口&#xff0c;运行以下的命令。 1、修改数据库为紧急模式 ALTER DATABASE demo SET EMERGENCY 2、使数据库变为单用户模式 ALTER DATABASE demo SET SINGL…...

Linux: network: wireshark IO图的一个问题

今天遇到一个问题&#xff0c;发现wireshark画的IO图&#xff0c;前几秒没有数据&#xff0c;但是根据Raw的pcap看&#xff0c;是有包的&#xff0c;这就迷惑了。 经同事提醒&#xff0c;这个IO在设置了多个画图filter的时候&#xff0c;可能导致开始前几秒没有输出。如下图 这…...

TMGM平台可靠么?交易是否安全?

在选择外汇交易平台时&#xff0c;安全性与可靠性是投资者最关注的要素之一。作为全球知名的外汇及差价合约交易平台&#xff0c;TMGM&#xff08;tmgm-pt.com&#xff09;的安全性与可靠性可以从多个方面进行评估&#xff0c;包括监管环境、资金安全、客户服务、交易技术与服务…...

软工毕设开题建议

文章目录 &#x1f6a9; 1 前言1.1 选题注意事项1.1.1 难度怎么把控&#xff1f;1.1.2 题目名称怎么取&#xff1f; 1.2 开题选题推荐1.2.1 起因1.2.2 核心- 如何避坑(重中之重)1.2.3 怎么办呢&#xff1f; &#x1f6a9;2 选题概览&#x1f6a9; 3 项目概览题目1 : 深度学习社…...

Python自动化发票处理:使用Pytesseract和Pandas从图像中提取信息并保存到Excel

1. 引言 在财务部门&#xff0c;处理大量的纸质或扫描版发票是一项既耗时又容易出错的任务。通过使用Python中的pytesseract&#xff08;一个OCR工具&#xff09;和pandas库&#xff0c;我们可以自动化这一过程&#xff0c;从而提高工作效率并减少错误。 2. 安装所需库 首先…...

新手直播方案

简介 新手直播方案 &#xff0c;低成本方案 手机/电脑 直接直播手机软件电脑直播手机采集卡麦电脑直播多摄像机 机位多路采集卡 多路麦加电脑&#xff08;高成本方案&#xff09; 直播推流方案 需要摄像头 方案一 &#xff1a;手机 电脑同步下载 网络摄像头 软件&#xff08…...

【大模型理论篇】主流大模型的分词器选择及讨论(BPE/BBPE/WordPiece/Unigram)

1. 背景分析 分词是将输入和输出文本拆分成更小单位的过程&#xff0c;使得大模型能够处理。token可以是单词、字符、子词或符号&#xff0c;取决于模型的类型和大小。分词可以帮助模型处理不同的语言、词汇和格式&#xff0c;并降低计算和内存成本。分词还可以通过影响token的…...

RootlessJamesDSP:无Root环境下的Android全局音频处理方案解析

1. 项目概述&#xff1a;在无根环境中驯服音频的“魔法师”如果你是一个对手机音质有追求的安卓用户&#xff0c;或者是一个喜欢折腾音频处理插件的玩家&#xff0c;那么你很可能听说过或者用过 JamesDSP。它是一款功能强大的音频处理引擎&#xff0c;能够通过复杂的算法&#…...

IJPay实战:一站式解决微信APP支付签名与回调难题

1. 为什么选择IJPay解决微信APP支付难题 第一次接触微信APP支付时&#xff0c;我被官方文档里密密麻麻的参数列表吓到了。特别是签名验证环节&#xff0c;光是参数顺序错误就让我调试了整整两天。后来发现团队里老张的项目接支付接口特别快&#xff0c;追问之下才知道用了IJPay…...

Shiv进阶教程:解决Python依赖管理的7个实用技巧

Shiv进阶教程&#xff1a;解决Python依赖管理的7个实用技巧 【免费下载链接】shiv shiv is a command line utility for building fully self contained Python zipapps as outlined in PEP 441, but with all their dependencies included. 项目地址: https://gitcode.com/g…...

终极罗技PUBG鼠标宏配置:告别枪口上跳的智能解决方案

终极罗技PUBG鼠标宏配置&#xff1a;告别枪口上跳的智能解决方案 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为《绝地求生》中的枪口上跳…...

Go项目安全左移实践:集成Security-Shield实现自动化漏洞与密钥检测

1. 项目概述与核心价值 在当今的软件开发与运维实践中&#xff0c;应用安全已经从“附加题”变成了“必答题”。无论是个人开发者的小型项目&#xff0c;还是企业级的复杂系统&#xff0c;都面临着来自网络的各种潜在威胁。然而&#xff0c;安全工具的引入往往伴随着陡峭的学习…...

MCP协议实战:构建AI智能体任务管理服务器与二次开发指南

1. 项目概述&#xff1a;一个为AI智能体“开眼”的MCP服务器最近在折腾AI智能体&#xff08;Agent&#xff09;开发的朋友&#xff0c;估计都绕不开一个词&#xff1a;MCP。全称是Model Context Protocol&#xff0c;你可以把它理解为给大模型&#xff08;比如Claude、GPT-4&am…...

5分钟搞定Mac Boot Camp驱动部署:Brigadier全攻略

5分钟搞定Mac Boot Camp驱动部署&#xff1a;Brigadier全攻略 【免费下载链接】brigadier Fetch and install Boot Camp ESDs with ease. 项目地址: https://gitcode.com/gh_mirrors/bri/brigadier 还在为Mac安装Windows系统时繁琐的驱动匹配而烦恼吗&#xff1f;每次重…...

Python 爬虫反爬突破:CDN 防护节点穿透采集

前言 当下大型互联网站点、电商平台资讯门户、行业数据网站均全面接入 CDN 内容分发网络&#xff0c;借助全球节点缓存、流量调度、智能分流、节点 IP 隐身、区域访问限制等机制构建底层防护体系。传统爬虫直接请求源站 IP 的方式会被 CDN 节点拦截、跳转、限速、IP 封禁、节点…...

多目标粒子群混合储能优化配置【附算法】

✨ 长期致力于混合储能、优化配置、风光互补微电网、多目标粒子群算法、CRITIC-TOPSIS研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;风光-负荷多场景…...

为AI智能体构建可编程邮箱:mailbot实战指南

1. 项目概述&#xff1a;为AI智能体打造专属的“可编程邮箱”如果你正在开发一个AI智能体&#xff0c;无论是客服机器人、自动化工作流还是个人助理&#xff0c;让它具备收发邮件的能力往往是刚需。传统的做法是什么&#xff1f;要么去折腾Gmail的API&#xff0c;忍受OAuth授权…...