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(*)

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

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

相关文章

Linux中DNS搭建

文章目录 一、DNS介绍1.1、DNS是什么1.2、DNS的工作原理1.3、DNS的域名结构 二、Bind介绍2.1、bind概述2.2、bind主要配置文件 三、DNS安装四、主要配置文件解析&#xff08;除/etc/named.conf&#xff09;4.1、/etc/named.rfc1912.zones4.2、/etc/rc.d/init.d/named4.3、/etc/…

批处理操作的优化

原来的代码 Override Transactional(rollbackFor Exception.class) public void batchAddQuestionsToBank(List<Long> questionIdList, Long questionBankId, User loginUser) {// 参数校验ThrowUtils.throwIf(CollUtil.isEmpty(questionIdList), ErrorCode.PARAMS_ERR…

基于neo4j的新冠治疗和新冠患者轨迹的知识图谱问答系统

毕业设计还在苦恼选题&#xff1f;想做一个兼具前沿性和实用性的技术项目&#xff1f;了解下这款基于Neo4j的新冠治疗和患者轨迹的知识图谱问答系统吧&#xff01; 系统可以实现两大功能模块&#xff1a;新冠医疗信息和患者活动轨迹的展示与问答。通过图谱技术&#xff0c;你可…

CLion远程开发Ubuntu,并显示helloworld文字框

1.CLion的介绍以及其在远程开发上的优点 1&#xff09;CLion 是一个由 JetBrains 开发的跨平台 C/C 集成开发环境&#xff08;IDE&#xff09;&#xff0c;功能强大。 2&#xff09;CLion的优点&#xff1a; 远程工具链支持&#xff1a;CLion 支持通过 SSH 连接到远程 Ubuntu…

【AIGC】优化长提示词Prompt:提升ChatGPT输出内容的准确性与实用性

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;长提示词的挑战&#x1f4af;谷歌的优化长提示词技术关键因素分析 &#x1f4af;长提示词的设计原则&#x1f4af;优化长提示词的新框架方法&#x1f4af;实验结果分析不…

解决Github下载速度慢的问题

1. 方式一 先把hosts文件先复制一份到其他文件夹下&#xff0c;以免造成不小心改动出现的后果在C盘的C:\Windows\System32\drivers\etc 下的hosts文件 用编辑器打开后&#xff0c;在末尾处添加访问如下的两个网站所返回的两个IP https://github.com.ipaddress.com/ http://gi…

尝鲜electron --将已有vue/react项目转换为桌面应用

Electron 是一个强大的框架&#xff0c;它允许开发者使用 Web 技术&#xff08;如 HTML、CSS 和 JavaScript&#xff09;构建跨平台的桌面应用程序。它结合了 Node.js 和 Chromium&#xff0c;就相当于在桌面程序web和游览器,所以只需要简单的配置就可以转换为桌面应用 注意:无…

IDEA关联Tomcat——最新版本IDEA 2024

1.链接Tomcat到IDEA上 添加Tomcat到IDEA上有两种方式&#xff1a; 第一种&#xff1a; &#xff08;1&#xff09;首先&#xff0c;来到欢迎界面&#xff0c;找到左侧的Customize选项 &#xff08;2&#xff09;然后找到Build、Execution、Deployment选项 &#xff08;3&am…

Prism 四事件聚合器

#1024程序员节&#xff5c;征文# 不废话&#xff0c;直接上代码一个简单的示例。 1、事件聚合 创建一个文件夹EventBLL&#xff0c;添加EventDemo.cs&#xff0c;代码如下。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using …

.NET使用QuestPDF高效地生成PDF文档

前言 在.NET平台中操作生成PDF的类库有很多如常见的有iTextSharp、PDFsharp、Aspose.PDF等&#xff0c;今天我们分享一个用于生成PDF文档的现代开源.NET库&#xff1a;QuestPDF&#xff0c;本文将介绍QuestPDF并使用它快速实现发票PDF文档生成功能。 QuestPDF介绍 QuestPDF 是…

什么样的JSON编辑器才好用

简介 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也便于机器解析和生成。随着互联网和应用程序的快速发展&#xff0c;JSON已经成为数据传输和存储的主要格式之一。在处理和编辑JSON数据…

Python开发日记 -- 实现bin文件的签名

目录 1.数据的不同表现形式签名值不一样&#xff1f; 2.Binascii模块简介 3.问题定位 4.问题总结 1.数据的不同表现形式签名值不一样&#xff1f; Happy Muscle试运行了一段时间&#xff0c;组内同事再一次提出了新的需求&#xff1a;需要对bin文件签名。 PS&#xff1a;服…

vue3 树型视图,利用自定义SFC来定义一个TreeItem,然后进行渲染出一个树形。

1、我们在各种项目中都会碰到树形的视图&#xff0c;所以说这个还是很重要的。 2、项目中我们一般会用现成的组件&#xff08;ant-design、element&#xff09;来处理&#xff0c;这里我们使用自定义的方法&#xff0c;提供一个data来处理&#xff0c;比如这样&#xff1a; 最…

【大数据分析与挖掘模型】matlab实现——非线性回归预测模型

一、实验目的 掌握有关非线性回归的理论知识&#xff0c;通过变量代换把本来应该用非线性回归处理的问题近似转化为线性回归问题&#xff0c;并进行分析预测。 二、实验任务 对非线性回归实例进行编码计算&#xff0c;实例如下&#xff1a; 三、实验过程 1.运行非线性回归中…

AJAX—— jQuery 发送 AJAX 请求

1、get 请求 $.get&#xff08;url&#xff0c;[ data ] , [ callback ] , [ type ]&#xff09; url &#xff1a;请求的 URL 地址 data &#xff1a;请求携带的参数 callback &#xff1a;载入成功时回调函数 type &#xff1a;设置返回内容格式&#xff08;xml&#xf…

duilib的应用 在双屏异分辨率的显示器上 运行显示不出来

背景&#xff1a;win11&#xff0c;duilib应用&#xff0c;双显示器&#xff0c;两台分辨率相同&#xff0c;分别设置不同的缩放以后&#xff0c;应用运行以后&#xff0c;程序闪一下消失或者程序还在&#xff0c;但是UI显示不出来。 原因 窗口风格设置不合理&#xff0c;所以…

什么是域名?什么是泛域名?

域名 定义 域名是互联网上用于识别和定位网站或网络服务的名称。它是由一串用点分隔的字符组成&#xff0c;例如 “baidu.com”。就像是现实生活中建筑物的地址&#xff0c;方便用户在互联网的海量信息中找到特定的网站。 结构 域名从右到左依次为顶级域名&#xff08;TLD&…

【Python爬虫系列】_031.Scrapy_模拟登陆中间件

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)教程合集 👈👈…

【ArcGIS微课1000例】0125:ArcGIS矢量化无法自动完成面解决方案

文章目录 一、坐标系统问题二、正确使用自动完成面工具一、坐标系统问题 1. 数据库坐标系 arcgis矢量化的过程中,无法自动完成面,可能是因为图层要素没有坐标系造成的。双击数据库打开数据库属性,可以查看当前数据框的坐标系。 2. 图层坐标系 双击图层,打开图层属性,切…

csa练习1

1、修改当前主机名为rhcsa&#xff0c;设置当前时区为Asia/Shanghai 2、在/home/和/root目录下面创建file1文件和dir1目录 3、在/home/file1文件里面写入内容hello&#xff0c;welcome to home 4、在/root/file1文件里面写入当前的时间并写入内容this is administrator 5、在/r…