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 sessionmaker Session = sessionmaker(bind=engine)#先通过时间创造器绑定引擎->创建这个会话类 session = Session()#根据我们自己的Session类创建属于我们自己的实例对象用于后续操作
    1. 详细版:

      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 增

  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为空时】:

      下一集我再对如何显示数据库做一个解释吧,毕竟是从零开始(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:

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

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)

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

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

    原数据库:

    删除后:

    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简单的增删查改的更多相关文章

  1. nodejs连接mysql并进行简单的增删查改

    最近在入门nodejs,正好学习到了如何使用nodejs进行数据库的连接,觉得比较重要,便写一下随笔,简单地记录一下 使用在安装好node之后,我们可以使用npm命令,在项目的根目录,安装nodejs ...

  2. mybatis实现简单的增删查改

    接触一个新技术,首先去了解它的一些基本概念,这项技术用在什么方面的.这样学习起来,方向性也会更强一些.我对于mybatis的理解是,它是一个封装了JDBC的java框架.所能实现的功能是对数据库进行增 ...

  3. Java连接MySQL数据库及简单的增删查改操作

    主要摘自 https://www.cnblogs.com/town123/p/8336244.html https://www.runoob.com/java/java-mysql-connect.h ...

  4. RavenDb学习(二)简单的增删查改

    在上一节当中已经介绍了RavenDb的文档设计模式,这一节我们要具体讲一讲如何使用api去访问RavenDb .连接RavenDb var documentStore = new DocumentSt ...

  5. MySQL学习-入门语句以及增删查改

    1. SQL入门语句 SQL,指结构化查询语言,全称是 Structured Query Language,是一种 ANSI(American National Standards Institute ...

  6. MySQL学习笔记1(增删查改)

    创建表: /* 创建数据库 create database 数据库名; */ CREATE DATABASE mybase; /* 使用数据库 use 数据库名 */ USE mybase; /* 创 ...

  7. Hibernate 的事物简单的增删查改

    Hibernate 是一个优秀的ORM框架体现在: 1. 面向对象设计的软件内部运行过程可以理解成就是在不断创建各种新对象.建立对象之间的关系,调用对象的方法来改变各个对象的状态和对象消亡的过程,不管 ...

  8. 【SSH网上商城项目实战02】基本增删查改、Service和Action的抽取以及使用注解替换xml

    转自:https://blog.csdn.net/eson_15/article/details/51297698 上一节我们搭建好了Struts2.Hibernate和Spring的开发环境,并成功 ...

  9. EF简单的增删查改

    Add /// <summary> /// /// </summary> public void Add() { TestDBEntities2 testdb = new Te ...

  10. 一般处理程序+htm C#l简单的增删查改

    首先引用两个文件一个dll: 数据库表已创建 首先编写数据读取部分 /// <summary> /// 查询 /// </summary> /// <param name ...

随机推荐

  1. Stream流,集合与基本数组的相互转换

    Arrays类的Api stream()方法传入数组,返回对应的stream流. Collection集合的Api: stream()不传参数,返回Stream流. 有了上述Api可以完成如下转换.. ...

  2. UniswapV2Pair细节

    UniswapV2Pair合约是Uniswap V2协议中的核心部分,用于管理流动性池.代币交换.流动性代币的铸造和销毁等操作.以下是对UniswapV2Pair合约中所有主要方法及其参数的详细讲解. ...

  3. 最逼真的AI换脸软件,Pluse下载介绍(可直播)

    Pluse是基于人工智能的实时AI换脸工具,可以在无需任何前期数据训练的情况下,通过一张照片快速替换视频中的人脸,它支持高分辨率细节重建.色彩矫正,并能实时替换多目标人脸,非常适合娱乐社交.影视制作和 ...

  4. 干货分享:Air700ECQ的硬件设计,第三部分

    ​ 5. 电器特性,可靠性,射频特性 5.1. 绝对最大值 下表所示是模块数字.模拟管脚的电源供电电压电流最大耐受值. 表格 17:绝对最大值 参数 最小 最大 单位 VBAT -0.3 4.7 V ...

  5. 为政务单位免费提供IP地址https证书—JoySSL

    JoySSL作为知名的证书颁发机构(CA),确实为政务单位提供了IP地址HTTPS证书的免费测试证书服务.以下是对此服务的详细介绍: 一.证书类型与特点 证书类型:JoySSL为政务单位提供了专为IP ...

  6. MyBatis入门示例——MyBatis学习笔记之一

    MyBatis是另外一款优秀的ORM框架,前身为iBATIS.凡事预则立,不预则废.鉴于以后的项目可能会用到它,因此决定提前学习.本着分享和督促自己学习的目的,笔者将陆续把学习笔记贴出,希望对朋友们有 ...

  7. java公式解析器学习与开发(1)

    public class Evaluate { public static void main(String[] args) { Stack<String> ops = new Stack ...

  8. Java 网页浏览器组件介绍

    王 凯迪, 软件工程师, Convergys 上海研发中心 简介: 使用 Java 开发客户端应用有时会需要使用到浏览器组件,本文将介绍在 Java 用户界面中使用浏览器的四种方法,并且比较它们各自的 ...

  9. MySQL数据库设计规范(新)

    目录 规范背景与目的 设计规范2.1 数据库设计2.1.1 库名2.1.2 表结构2.1.3 列数据类型优化2.1.4 索引设计2.1.5 分库分表.分区表2.1.6 字符集2.1.7 程序DAO层设 ...

  10. S2P彩蝶流向数据管理穿透到终端才有意义

    这两年我们也是在医药行业服务当中见证了行业的变化和趋势,流向管理系统,至少到目前,在行业当中将会是很大的趋势. 01过去粗放的流向管理方式 早在十年前,整个医药行业,特别是外资企业.对实时流向管理,流 ...