• SQLAlchemy学习-2.query() 查询数据


    前言

    SQLAlchemy 使用 query() 方法查询数据

    创建模型

    接着前面一篇创建的模型

    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import create_engine, Column, Integer, String
    
    # 拼接配置dialect + driver://username:passwor@host:port/database
    DB_URI = 'mysql+pymysql://root:123456@localhost:3306/web'
    Base = declarative_base()
    
    
    class Students(Base):
        __tablename__ = 'students'  # 数据库表名
    
        id = Column(Integer, primary_key=True)
        name = Column(String(20))
        fullname = Column(String(30))
        nickname = Column(String(30))
    
        def __repr__(self):
            return "" % (
                     self.name, self.fullname, self.nickname)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    创建session实例

    from sqlalchemy.orm import sessionmaker
    from sqlalchemy import create_engine
    from xx.xx import Students
    
    engine = create_engine('mysql+pymysql://root:123456@localhost:3306/web')
    # 把当前的引擎绑定给这个会话
    Session = sessionmaker(bind=engine)
    # 实例化
    session = Session()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    query() 查询

    query() 查询会转换成对应的SQL 语句

    # query()
    r1 = session.query(Students)
    print(r1)
    
    • 1
    • 2
    • 3

    等价于

    SELECT students.id AS students_id, students.name AS students_name, students.fullname AS students_fullname, students.nickname AS students_nickname 
    FROM students
    
    • 1
    • 2

    query()可以只查询某个字段,多个字段逗号隔开

    r2 = session.query(Students.name)
    print(r2)
    
    • 1
    • 2

    等价于

    SELECT students.name AS students_name 
    FROM students
    
    • 1
    • 2

    all()查询全部数据

    all()查询全部数据

    from sqlalchemy.orm import sessionmaker
    from sqlalchemy import create_engine
    from xx.xx import Students
    
    engine = create_engine('mysql+pymysql://root:123456@localhost:3306/web')
    # 把当前的引擎绑定给这个会话
    Session = sessionmaker(bind=engine)
    # 实例化
    session = Session()
    
    
    all = session.query(Students).all()
    print(all)
    for item in all:
        print(item.name, item.fullname)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    运行结果

    [,
     , 
    ]
    yoyo yoyoketang
    yoyo1 yoyoketang1
    yoyo2 yoyoketang2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    all 查询的结果是一个list of Students对象

    first() 返回查询结果第一个数据

    first = session.query(Students).first()
    print(first)
    
    • 1
    • 2

    运行结果

    
    
    • 1

    filter()筛选过滤

    filter()方法加筛选条件

    # filter() 过滤
    r1 = session.query(Students).filter(Students.name == 'yoyo')
    print(r1)
    
    • 1
    • 2
    • 3

    等价于以下sql

    SELECT students.id AS students_id, students.name AS students_name, students.fullname AS students_fullname, students.nickname AS students_nickname 
    FROM students 
    WHERE students.name = %(name_1)s
    
    • 1
    • 2
    • 3

    查询结果需加 all() 方法得到全部结果,或者 first() 方法得到第一个结果

    # filter() 过滤
    r1 = session.query(Students).filter(Students.name == 'yoyo').all()
    print(r1)  # []
    
    • 1
    • 2
    • 3

    以上查询类似于 SELECT * FROM ...,如果查询结果只需要某个字段,可以在query()方法指定字段名称

    # filter() 过滤
    r1 = session.query(Students.name).filter(Students.name == 'yoyo').all()
    print(r1)  # [('yoyo',)]
    
    r2 = session.query(Students.name, Students.fullname).filter(Students.name == 'yoyo').all()
    print(r2)  # [('yoyo', 'yoyoketang')]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    字符串可以判断相等,数字类型的可以判断 >=<=

    r3 = session.query(Students.name).filter(Students.id >= 1).all()
    print(r3)  # [('yoyo',), ('yoyo1',), ('yoyo2',)]
    
    • 1
    • 2

    and和or 多条件查询

    在filter()中用,分隔多个条件表示and

    r = session.query(Students.name).filter(Students.id >= 1, Students.name == 'yoyo').all()
    print(r)  # [('yoyo',)]
    
    • 1
    • 2

    or_方法实现 or 条件查询

    from sqlalchemy import or_
    
    r = session.query(Students.name).filter(or_(Students.id >= 1, Students.name == 'yoyo')).all()
    print(r)  # [('yoyo',), ('yoyo1',), ('yoyo2',)]
    
    • 1
    • 2
    • 3
    • 4

    order_by()排序

    根据id倒叙

    r4 = session.query(Students).order_by(Students.id.desc()).all()  # desc()表示倒序
    print(r4)
    
    • 1
    • 2

    运行结果

    [, 
    ,
    ]
    
    • 1
    • 2
    • 3

    like 和 in

    判断等于和不等于可以直接用 ==!=

    like() 模糊匹配

    r = session.query(Students.name).filter(Students.name.like('%yoyo%')).all()
    print(r)  # [('yoyo',), ('yoyo1',), ('yoyo2',)]
    
    • 1
    • 2

    in_() 包含

    r = session.query(Students.name).filter(Students.name.in_(['yoyo', 'yoyo1'])).all()
    print(r)  # [('yoyo',), ('yoyo1',)]
    
    • 1
    • 2

    count() 计算个数

    .count()方法统计查询个数

    r = session.query(Students).count()
    print(r)  # 3
    r1 = session.query(Students).filter(Students.name == 'yoyo').count()
    print(r1)  # 1
    
    • 1
    • 2
    • 3
    • 4

    切片

    all()方法返回的是一个list,那就可以通过切片取一部分数据

    # 返回前2条数据
    r = session.query(Students.name).all()[:2]
    print(r)  # [('yoyo',), ('yoyo1',)]
    
    • 1
    • 2
    • 3

    delete() 删除数据

    根据查询结果,调用delete()方法删除对应数据,需要执行session.commit()提交事务。

    session.query(Students).filter(Students.name == 'yoyo').delete()
    session.commit()
    
    • 1
    • 2

    update() 修改数据

    update()方法,需要执行session.commit()提交事务

    # 修改fullname
    session.query(Students).filter(Students.name == 'yoyo1').update({'fullname': 'zhangsan'})
    session.commit()
    
    # 修改后查询
    r = session.query(Students).filter(Students.name == 'yoyo1').all()
    print(r)  # []
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    从运行结果可以看到已经更新成功。

  • 相关阅读:
    【位操作笔记】计算以2为底整数N的对数 查表法
    深入了解JUC并发(二)并发理论
    TCP协议的核心机制
    Qt实用技巧:在CentOS上使用linuxdeployqt打包发布qt程序
    解决问题:-1: error: LNK1104: 无法打开文件“D3dx9.lib”
    Linux操作系统
    零售超市如何应对消费者需求?非常全面!
    【GitLab私有仓库】在Linux上用Gitlab搭建自己的私有库并配置cpolar内网穿透
    hdlbits系列verilog解答(always块条件语句)-37
    Python——用新字符替换字符串中的旧字符
  • 原文地址:https://blog.csdn.net/qq_27371025/article/details/126440623