python SQLAlchemy ORM——从零开始学习 02简单的增删查改
02 简单的增删查改
前情提要:承接了01中的engine以及User类
2-1 了解会话机制
个人理解
在SQLAlchemy 增删查改中是依赖会话(Session)这个机制进行操作的,我个人的理解是用“会话“进行连接数据库周期的一系列管理操作(以下是ai生成对此会话的理解)
ai理解
在 SQLAlchemy 中,
sessionmaker是用于创建 会话(Session) 对象的工厂类,负责与数据库的交互。会话(Session)是 SQLAlchemy ORM 的核心部分,它管理与数据库的连接,并在一次操作中追踪对象的状态变化(如添加、修改、删除),同时处理事务的提交和回滚。会话(Session)的作用
- 管理事务:会话负责开始、提交和回滚事务。通过会话,SQLAlchemy 可以在多个数据库操作间提供原子性(即要么全部成功,要么全部失败)。
- 对象的持久化:会话在内存中追踪对象的状态变化,确保对象在数据库中得到正确的插入、更新或删除。
- 查询管理:会话管理 SQL 查询的生命周期,包括从数据库获取数据,执行查询语句等。
2-2 创建会话
流程:
- 导入对应包,依赖其中的
sessionmaker - 使用
sessionmaker生成新的会话对象Session,生成时绑定之前创建过的引擎 - 通过
Session对象我们来构造对应的实例【可能有点绕,但一开始2调用的只是我们绑定好的类,我们还需要对这个对象创造实例来进行会话管理操作】
- 导入对应包,依赖其中的
官方的用例参考,他用的数据库类型不一样,但是思路是一样的:
eg1:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker # an Engine, which the Session will use for connection
# resources
engine = create_engine("postgresql+psycopg2://scott:tiger@localhost/") Session = sessionmaker(engine) with Session() as session:
session.add(some_object)
session.add(some_other_object)
session.commit()
eg2:这个就是后文使用的创建实例进行操作了
session = Session()
try:
session.add(some_object)
session.add(some_other_object)
session.commit()
finally:
session.close()
eg3:
Session = sessionmaker(engine) with Session.begin() as session:
session.add(some_object)
session.add(some_other_object)
# commits transaction, closes session
看完官方的实例,来写我们自己的会话管理了:
- 简化版:
from test_package_sql import engine, User #这个只是导入01文件提及的engine和User类,名字自己改一下
from sqlalchemy.orm import sessionmaker Session = sessionmaker(bind=engine)#先通过时间创造器绑定引擎->创建这个会话类 session = Session()#根据我们自己的Session类创建属于我们自己的实例对象用于后续操作
详细版:
from sqlalchemy import create_engine, Column, Integer, Float, String
from sqlalchemy.orm import declarative_base from sqlalchemy.orm import sessionmaker local_url = "sqlite:///02_test.db"
engine = create_engine(url=local_url)
local_base = declarative_base()
class User(local_base):
__tablename__ = "User"
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer) local_base.metadata.create_all(engine)
2-3 增
事前bb【觉得烦的可以略过】
在进行增删查改前,必须再强调一下这个会话机制的流程:创建会话->进行管理操作(包括但不不限于增删查改)->提交会话管理【注意,提交时的更改的只是当前会话状态,言下之意,你提交了一次再修改,没提交那还是之前提交的状态】
流程介绍【增加单个User对象】
创建需要增添的实例——必须与User类相匹配,就是说是User类对象
使用对话机制的
session.add接口进行添加添加若干个后,结束则使用
session.commit()进行修改后的提交主函数直接调用就好,我这样子写好封装,看得也清楚,很简单对吧
def add_one():
User1 = User(name="arthur",age=18)
User2 = User(name="lihua",age=21)
session.add(User1)
session.add(User2)
session.commit()
增添效果如下【db为空时】:

下一集我再对如何显示数据库做一个解释吧,毕竟是从零开始(bushi)
增添多个对象【或者是User_list】
只需要修改接口以及传入参数就好了,使用
session.add_all()接口def add_Users():
User1 = User(name="arthur", age=18)
User2 = User(name="lihua", age=21)
Users = [User1,User2]
session.add_all(Users)
session.commit()
- explain:Users就是User 类(项目)的可迭代对象(列表),让我们看看官方对于这个接口的解释:
method
sqlalchemy.orm.Session.add_all(instances: Iterable[object]) → NoneAdd the given collection of instances to this
Session.添加实例到Seesion会话中。这句话可能不太好理解,看看他的传参解释其实就很直观,其实就是传入可迭代对象XD
output:

就结束了,其实增删改查不难,接口已经抽象出来了,记住逻辑就好
2-4 查
还是得先说查啊,不然没法删啊0v0
接口介绍
q = session.query(SomeMappedClass)参数介绍:
SomeMappedClass:所映射的类q:返回的类型是Query[Any],即任何满足要求的数据常用后缀
.all():以列表的形式传回搜索的结果
session.query(User).all()#用来返回User表的所有数据
sqlalchemy.orm.Query.filter_by(* *kwargs)¶ 这个是常用的简化版的搜索接口。!注意他可以同时接收多个变量,且只使用等值过滤条件results = session.query(User).filter_by(ag,e=21)
results = session.query(User).filter_by(age=21,name="lihua")
session.query(Model).filter(condition)运行使用多个复杂的表达式,支持更多条件类型,支持手动连接多个条件:如果需要多个条件,可以使用
AND或OR手动连接条件。但就说注意对比时需要User.xxx--你自己定义的类表results = session.query(User).filter(User.name == 'arthur')#不止支持== ,还支持其他比较运算符
.one_or_none()用于查找是否只有一个或者none个,找到多个则会报错
编码
其实把上面的看懂了就已经学会了如何搜索了
简单搜索法:
def search():
results = session.query(User).filter_by(age=21)
for result_one in results:
print(result_one)

使用传统接口更多扩展的的搜索:
def other_way_search():
results = session.query(User).filter(User.name == 'arthur')
for result_one in results:
print(result_one)
2-5 删
- 删除主要运用到
session.delete(object)接口,主要有以下两种用法:
- 删除单个对象:
session.delete(object)#object是单个对象
session.commit()
删除多个满足条件的对象
session.query(Model).filter(condition).delete()
session.commit()
流程大概是:找到想要删除的对象->删除->提交
code:
def remove_one():#单个
results = session.query(User).filter_by(age=21).first()#找到第一个
session.delete(results)
session.commit()
原数据库:

删除后:

def remove_all():#多个
results = session.query(User).filter_by(name='arthur').delete()
session.commit()
删除后:

删除尾声:
删除就结束了,最后各位可以尝试把lihua也删除,然后根据上面的教程添加再添加4个User信息,其中要有两个age、name不一样
参考code:
def add_4new_user():
User1 = User(name='arthur', age=18)
User2 = User(name='Abigail Williams',age=14)
User3 = User(name='caster', age=21)
User4 = User(name='Lilith', age=22)
users = [User1,User2,User3,User4]
session.add_all(users)
session.commit()
结果:

2-6 改
改其实最简单,找到对应的object然后修改,提交即可,非常朴实无华
def update_f():
caster = session.query(User).filter_by(name="caster").one_or_none()#找到一个caster的信息
caster.age = 18 #修改就好啦
session.commit() #记得提交

part2结束,感谢观看,读者可以自行实践一下增删查改,最好融合起来一起实践
python SQLAlchemy ORM——从零开始学习 02简单的增删查改的更多相关文章
- nodejs连接mysql并进行简单的增删查改
最近在入门nodejs,正好学习到了如何使用nodejs进行数据库的连接,觉得比较重要,便写一下随笔,简单地记录一下 使用在安装好node之后,我们可以使用npm命令,在项目的根目录,安装nodejs ...
- mybatis实现简单的增删查改
接触一个新技术,首先去了解它的一些基本概念,这项技术用在什么方面的.这样学习起来,方向性也会更强一些.我对于mybatis的理解是,它是一个封装了JDBC的java框架.所能实现的功能是对数据库进行增 ...
- Java连接MySQL数据库及简单的增删查改操作
主要摘自 https://www.cnblogs.com/town123/p/8336244.html https://www.runoob.com/java/java-mysql-connect.h ...
- RavenDb学习(二)简单的增删查改
在上一节当中已经介绍了RavenDb的文档设计模式,这一节我们要具体讲一讲如何使用api去访问RavenDb .连接RavenDb var documentStore = new DocumentSt ...
- MySQL学习-入门语句以及增删查改
1. SQL入门语句 SQL,指结构化查询语言,全称是 Structured Query Language,是一种 ANSI(American National Standards Institute ...
- MySQL学习笔记1(增删查改)
创建表: /* 创建数据库 create database 数据库名; */ CREATE DATABASE mybase; /* 使用数据库 use 数据库名 */ USE mybase; /* 创 ...
- Hibernate 的事物简单的增删查改
Hibernate 是一个优秀的ORM框架体现在: 1. 面向对象设计的软件内部运行过程可以理解成就是在不断创建各种新对象.建立对象之间的关系,调用对象的方法来改变各个对象的状态和对象消亡的过程,不管 ...
- 【SSH网上商城项目实战02】基本增删查改、Service和Action的抽取以及使用注解替换xml
转自:https://blog.csdn.net/eson_15/article/details/51297698 上一节我们搭建好了Struts2.Hibernate和Spring的开发环境,并成功 ...
- EF简单的增删查改
Add /// <summary> /// /// </summary> public void Add() { TestDBEntities2 testdb = new Te ...
- 一般处理程序+htm C#l简单的增删查改
首先引用两个文件一个dll: 数据库表已创建 首先编写数据读取部分 /// <summary> /// 查询 /// </summary> /// <param name ...
随机推荐
- .NET 开源扁平化、美观的 C/S 控件库
前言 给大家推荐一个优秀的控件集,它基于 .NET Framework 4.0,采用纯原生开发,不包含任何第三方插件或类库. 该控件集涵盖了常用的窗体和控件,同时还包括工业工具和类 Web 控件.使用 ...
- DDCA —— 缓存(Cache):缓存体系结构、缓存操作
1. 存储器层次(The Memory Hierarchy) 1.1 现代系统中的存储器 其中包括L1.L2.L3和DRAM 1.2 存储器的局限 理想存储器的需求如下: 零延迟 容量无限 零成本 带 ...
- .NET Core 委托底层原理浅谈
简介 .NET通过委托来提供回调函数机制,与C/C++不同的是,委托确保回调是类型安全,且允许多播委托.并支持调用静态/实例方法. 简单来说,C++的函数指针有如下功能限制,委托作为C#中的上位替代, ...
- atcoder ABC237-E Skiing
atcoder ABC237-E Skiing 传送门 这题把一个点到另外一个点的开心值变为这条边的权值,就可以化为求最大路.因为有负边权,所以要用\(SPFA\),但\(SPFA\)这玄学的时间复杂 ...
- .NET Core 线程(Thread)底层原理浅谈
简介 线程,进程,协程基本概念不再赘述. 原生线程和用户线程 原生线程 在内核态中创建的线程,只服务于内核态 用户线程 由User Application创建的线程,该线程会在内核态与用户态中间来回穿 ...
- 自动化部署之Gitlab+Jenkins+Docker
总结自动发布流程: Gitlab+Jenkins+Docker 一般部署方式: 1.外挂方式: 就是将实际的代码挂载到宿主机上,docker中提供程序运行的环境, 这样的话只需要更新对应的代码就够了 ...
- 鸿蒙NEXT元服务:收藏、卡片、用户协议、隐私声明、分享链接、评分与评论
相比应用,元服务的功能藏的比较深,这里记录一下常用功能的位置. 1.收藏(添加至我的服务) 打开元服务-->右上角四个点-->添加至我的服务-->手机滑到负一屏-->点击&qu ...
- Spring Boot 使用 slf4j 进行日志记录
SLF4J,即简单日志门面(Simple Logging Facade forJava),不是具体的日志解决方案,它只服务于各种各样的日志系统.按照官方的说法,SLF4J 是一个用于日志系统的简单Fa ...
- Natasha v9.0 为 .NET 开发者提供 [热执行] 方案.
项目简介 自 Natasha v9.0 发布起,我将基于 Natasha 的推出热执行方案,这项技术允许基于 控制台(Console) 和新版 Asp.net Core 架构的项目在运行中动态重编译, ...
- go build tags使用
转载请注明出处: 在 Go 语言中,构建标签(Build Tags)是一种用于条件编译的机制,可以帮助开发者根据不同的条件选择性地编译特定的代码块.它们在处理多平台和多环境的代码时特别有用,例如为不同 ...