python SQLAlchemy ORM——从零开始学习 02简单的增删查改

news/2025/1/8 15:48:09/文章来源:https://www.cnblogs.com/io-T-T/p/18659924

02 简单的增删查改

前情提要:承接了01中的engine以及User

2-1 了解会话机制

  1. 个人理解

    在SQLAlchemy 增删查改中是依赖会话(Session)这个机制进行操作的,我个人的理解是用“会话“进行连接数据库周期的一系列管理操作(以下是ai生成对此会话的理解)

  2. ai理解

    在 SQLAlchemy 中,sessionmaker 是用于创建 会话(Session) 对象的工厂类,负责与数据库的交互。会话(Session)是 SQLAlchemy ORM 的核心部分,它管理与数据库的连接,并在一次操作中追踪对象的状态变化(如添加、修改、删除),同时处理事务的提交和回滚。

    会话(Session)的作用

    1. 管理事务:会话负责开始、提交和回滚事务。通过会话,SQLAlchemy 可以在多个数据库操作间提供原子性(即要么全部成功,要么全部失败)。
    2. 对象的持久化:会话在内存中追踪对象的状态变化,确保对象在数据库中得到正确的插入、更新或删除。
    3. 查询管理:会话管理 SQL 查询的生命周期,包括从数据库获取数据,执行查询语句等。

2-2 创建会话

  • 流程:

    1. 导入对应包,依赖其中的 sessionmaker
    2. 使用sessionmaker 生成新的会话对象 Session ,生成时绑定之前创建过的引擎
    3. 通过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
    
  • 看完官方的实例,来写我们自己的会话管理了:

    1. 简化版:
    from test_package_sql import engine, User #这个只是导入01文件提及的engine和User类,名字自己改一下
    from sqlalchemy.orm import sessionmakerSession = sessionmaker(bind=engine)#先通过时间创造器绑定引擎->创建这个会话类session = Session()#根据我们自己的Session类创建属于我们自己的实例对象用于后续操作
    
    1. 详细版:

      from sqlalchemy import create_engine, Column, Integer, Float, String
      from sqlalchemy.orm import declarative_basefrom sqlalchemy.orm import sessionmakerlocal_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 增

  1. 事前bb【觉得烦的可以略过】

    在进行增删查改前,必须再强调一下这个会话机制的流程:创建会话->进行管理操作(包括但不不限于增删查改)->提交会话管理【注意,提交时的更改的只是当前会话状态,言下之意,你提交了一次再修改,没提交那还是之前提交的状态】

  2. 流程介绍【增加单个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为空时】:

      image-20250108000748412

      下一集我再对如何显示数据库做一个解释吧,毕竟是从零开始(bushi)

  3. 增添多个对象【或者是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]) → None

    Add the given collection of instances to this Session.

    添加实例到Seesion会话中。这句话可能不太好理解,看看他的传参解释其实就很直观,其实就是传入可迭代对象XD

    • output:

      image-20250108001929442

      就结束了,其实增删改查不难,接口已经抽象出来了,记住逻辑就好

2-4 查

还是得先说查啊,不然没法删啊0v0

  1. 接口介绍

    q = session.query(SomeMappedClass)

    • 参数介绍:

      SomeMappedClass:所映射的类

      q:返回的类型是Query[Any],即任何满足要求的数据

    • 常用后缀

      1. .all():以列表的形式传回搜索的结果
      session.query(User).all()#用来返回User表的所有数据
      
      1. 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")
        
      2. session.query(Model).filter(condition)

        运行使用多个复杂的表达式,支持更多条件类型,支持手动连接多个条件:如果需要多个条件,可以使用 ANDOR 手动连接条件。但就说注意对比时需要User.xxx--你自己定义的类表

        results = session.query(User).filter(User.name == 'arthur')#不止支持== ,还支持其他比较运算符
        
      3. .one_or_none()

        用于查找是否只有一个或者none个,找到多个则会报错

    1. 编码

      其实把上面的看懂了就已经学会了如何搜索了

      • 简单搜索法:

        def search():results = session.query(User).filter_by(age=21)for result_one in results:print(result_one)
        

        image-20250108150708363

      • 使用传统接口更多扩展的的搜索:

        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)接口,主要有以下两种用法:
  1. 删除单个对象:
session.delete(object)#object是单个对象
session.commit()
  1. 删除多个满足条件的对象

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

    原数据库:

    image-20250108151915387

    删除后:

    image-20250108151952755

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

    删除后:

    image-20250108152247865

  • 删除尾声:

    删除就结束了,最后各位可以尝试把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()
    

    结果:

    image-20250108153103874

2-6 改

改其实最简单,找到对应的object然后修改,提交即可,非常朴实无华

def update_f():caster = session.query(User).filter_by(name="caster").one_or_none()#找到一个caster的信息caster.age = 18			#修改就好啦session.commit()		#记得提交

image-20250108153851400

part2结束,感谢观看,读者可以自行实践一下增删查改,最好融合起来一起实践

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

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

相关文章

YASKAWA机械手维修DX100示教器通电无反应

安川机器人DX100示教器通电无反应可能由多种原因导致,以下是一些常见的原因及对应的解决方法:可能原因电源问题:电源线破损或电源插座接触不良。 硬件故障:示教器内部电路板或元件(如内存条、处理器或显示屏等)损坏。 软件问题:软件发生错误或版本不匹配。 其他故障:…

春节电商爆单背后的协作黑科技!

每到春节,电商平台的交易额都会迎来新一轮爆发。但你是否思考过,支撑这一庞大运作的团队如何在高压之下确保高效协作?答案或许就藏在你忽略的细节里:在线文档协作。 春节购物高峰的背后:团队协作挑战重重 春节期间,消费者习惯于提前囤年货、抢促销,购物高峰往往集中爆发…

Transformer、编码器、解码器、全连接FFN、自注意力机制、嵌入向量、残差连接层归一化

一.提出背景 Transformer最早是Google在2017年的Attention Is All You Need论文中提出,用于解决解决传统的序列到序列(Seq2Seq)模型在处理可变长序列时遇到的问题。(序列到序列:指的是模型的输入是一段序列,模型输出也是序列;比如语音识别中给模型一段中文语音序列,让模…

JS-22 字符串的方法_concat()

concat方法用于链接两个字符串,返回一个新字符串,不改变原字符串 var s1=zifuchuan var s2=tow s1.concat(s2)//"zifuchuantow" s1//"zifuchuan" 该方法可以接受多个参数 two.concat(zifuchuan,three)//"zifuchuanthreetwo" 如果参数不是字符串…

年货抢购狂潮来袭,协作效率如何提升?

每年春节,都是电商企业竞争最激烈的战场。从年前的大促销到年后的物流爆单,作为电商团队的一员,你是否为节日期间高强度的工作节奏而焦虑?特别是在跨部门协作时,沟通不畅、任务延误、文档混乱等问题是否成为了团队效率的致命瓶颈? 在这一背景下,在线文档协作成为了提升春…

ASE100N10-ASEMI中低压N沟道MOS管ASE100N10

ASE100N10-ASEMI中低压N沟道MOS管ASE100N10编辑:ll ASE100N10-ASEMI中低压N沟道MOS管ASE100N10 型号:ASE100N10 品牌:ASEMI 封装:TO-220 批号:最新 最大漏源电流:100A 漏源击穿电压:100V RDS(ON)Max:8.8mΩ 引脚数量:3 芯片个数: 沟道类型:N沟道MOS管、低压MOS管 …

raylib U1S05 - 添加一个开始页面

先来看效果 看之前让我吐个槽。刚才编辑一半,结果我手贱点了个退出登录,然后都没了˃̣̣̥᷄⌓˂̣̣̥᷅开始按钮的图片是用豆包AI生成的,然后用美图秀秀抠图,改颜色。懒得自己搞素材的同学保存下面的三个图,注意改名字。普通状态 鼠标放上去 鼠标点击start_normal.png …

KES(KingBaseES)集群部署实战

今天我们将探讨关于KES(KingBaseES)的集群部署方案。作为示例,我们将以读写分离(RWC)集群为例,快速在本地进行部署和安装,并深入了解KES的部署流程。在本章中,我们将采用Windows平台上的可视化部署工具来进行集群的安装和配置。然而,由于硬件资源有限,本次演示仅展示…

测试图片功能

博客园的链接:123图床的链接:

JMeter-临界部分控制器-控制请求按顺序执行

一、路径: 二、操作: 把请求按顺序放到临界控制器下,请求会按顺序执行 三、执行效果