SQLAlchemy查询


结果查询:

  •  from databases.wechat import User
    from config import session def search():
    result = session.query(User).all() # 查询所有
    result = result[0] # 索引取值
    print(result.username) # 对象属性查询
    session.query(User).first() # 查询第一条 session.query(User).filter(User.username == 'bob').all() # 按条件查询所有 if __name__ == '__main__':
    search()
  • all() :
    • 查询所有
    • 返回一个列表对象
  • first()
    • 查询第一个符合条件的对象
    • 返回一个对象
  • 索引取值
    • 相当于列表取值
    • 返回一个列表内的值(对象)
  • 条件查询:
    • 用fillter方法来增加查询条件
  • 属性查询:
    • 直接该属性的对象对其进行普通的类属性的调用即可

条件查询

  •  from databases.wechat import User
    from config import session def search():
    # query接收一个查询范围,fillter增加查询条件的约束
    result = session.query(User.username).filter(User.username=='bob').all() # [('bob',)]
    result = session.query(User.username).filter_by(username='bob').all() # [('bob',)]
    """
    fillter和filter_by
    fillter可以进行比较运算(==, >, < ...)来对条件进行灵活的运用, 不同的条件用','(逗号)分割
    fillter_by只能指定参数传参来获取查询结果
    """ if __name__ == '__main__':
    search()
    query接收一个查询范围多个范围用逗号隔开,fillter增加查询条件的约束
    fillter和filter_by
    fillter可以进行比较运算(==, >, < ...)来对条件进行灵活的运用, 不同的条件用','(逗号)分割
    fillter_by只能指定参数传参来获取查询结果

模糊查询

  •  from databases.wechat import User
    from config import session def search():
    # like里面传入一个字符串,不确定的位置用%代替即可
    result = session.query(User.username).filter(User.username.like('b%')).all() # [('bob',)]
    # notlike取like的取反结果
    result = session.query(User.username).filter(User.username.notlike('b%')).all()
    # is_ 相当于 ==
    result = session.query(User.username).filter(User.username.is_(None)).all()
    result = session.query(User.username).filter(User.username == None).all()
    # isnot 相当于 !=
    result = session.query(User.username).filter(User.username.isnot(None)).all()
    result = session.query(User.username).filter(User.username != None).all()
    # in_传入一个可迭代对象,对前面的username进行约束, notin_ 和in_取反
    result = session.query(User.username).filter(User.username.in_(['bob', 'ivy1'])).all()
    result = session.query(User.username).filter(User.username.notin_(['bob', 'ivy1'])).all()
    # limit 限制数量查询, limit里传入一个整型来约束查看的数量, 当limit里面的参数大于实例表中的数量时,会返回所有的查询结果
    result = session.query(User.username).limit(6).all()
    # offset 偏移量查询,offset中传入一个整型,从表中的该位置开始查询,offset可以和limit混用来进行限制
    result = session.query(User.username).offset(1).all()
    result = session.query(User.username).offset(1).limit(6).all()
    # slice 切片查询,遵循左闭右开原则,可以和offset、limit混用
    result = session.query(User.username).slice(1, 3).offset(2).limit(6).all()
    # one 获取查询对象的一条,且查询的结果有且仅有一条,但查询结果多了的时候会报错
    result = session.query(User.username).filter_by(username='bob').one() if __name__ == '__main__':
    search()
  • like里面传入一个字符串,不确定的位置用%代替即可
  • notlike取like的取反结果
  • is_ 相当于 ==
  • isnot 相当于 !=
  • in_传入一个可迭代对象,对前面的username进行约束, notin_ 和in_取反
  • limit 限制数量查询, limit里传入一个整型来约束查看的数量, 当limit里面的参数大于实例表中的数量时,会返回所有的查询结果
  • offset 偏移量查询,offset中传入一个整型,从表中的该位置开始查询,offset可以和limit混用来进行限制
  • slice 切片查询,遵循左闭右开原则,可以和offset、limit混用
  • one 获取查询对象的一条,且查询的结果有且仅有一条,但查询结果多了的时候会报错
  •  from databases.wechat import User
    from config import session
    from sqlalchemy import desc def search():
    # 升序排列
    result = session.query(User.username, User.id).order_by(User.id).all()
    # 降序排列
    result = session.query(User.username, User.id).order_by(desc(User.id)).all()
    # 结合filter查询
    result = session.query(User.username, User.id).order_by(User.id).filter(User.username != 'bob').all()
    result = session.query(User.username, User.id).filter(User.username != 'bob').order_by(User.id).all() if __name__ == '__main__':
    search()

    排序查询,排序查询可结合filter、limit、slice等综合运用

 

聚合函数

  •  from databases.wechat import User
    from databases.config import session
    from sqlalchemy import func, extract def search():
    # count
    result = session.query(User.password, func.count(User.id)).group_by(User.password).all()
    # sum
    result = session.query(User.password, func.sum(User.id)).group_by(User.password).all()
    # max
    result = session.query(User.password, func.max(User.id)).group_by(User.password).all()
    # min
    result = session.query(User.password, func.min(User.id)).group_by(User.password).all()
    # having
    result = session.query(User.password, func.count(User.id)).group_by(User.password).having(func.count(User.id) > 1).all()
    # label extract
    result = session.query(
    extract('minute',User.create_time).label('minute'),
    func.count(User.id)
    ).group_by('minute')
    # 想当于-->SELECT EXTRACT(minute FROM user.create_time) AS minute, count(user.id) AS count_1 FROM user GROUP BY minute if __name__ == '__main__':
    search()

多表查询

  •  from databases.config import Base
    from sqlalchemy import Column, Integer, String, DateTime, Boolean, ForeignKey
    from datetime import datetime class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True, autoincrement=True)
    username = Column(String(20))
    password = Column(String(20))
    create_time = Column(DateTime, default=datetime.now())
    is_login = Column(Boolean, default=False, nullable=False) class UserDetails(Base):
    __tablename__ = 'userdetails'
    id = Column(Integer, primary_key=True, autoincrement=True)
    id_card = Column(Integer, nullable=True, unique=True)
    last_login = Column(DateTime)
    login_num = Column(Integer, default=0)
    user_id = Column(Integer, ForeignKey('user.id')) # user.id 表名+属性名 if __name__ == '__main__':
    Base.metadata.create_all()

    新建表

  •  from databases.wechat import User, UserDetails
    from databases.config import session def search():
    # 笛卡尔连接
    result = session.query(User, UserDetails)
    # SELECT user.id AS user_id, user.username AS user_username, user.password AS user_password, user.create_time AS user_create_time, user.is_login AS user_is_login, userdetails.id AS userdetails_id, userdetails.id_card AS userdetails_id_card, userdetails.last_login AS userdetails_last_login, userdetails.login_num AS userdetails_login_num, userdetails.user_id AS userdetails_user_id FROM user, userdetails
    # 加filter查询
    result = session.query(User, UserDetails).filter(UserDetails.id==User.id).all()
    result = session.query(User.username, UserDetails.id_card).join(UserDetails, UserDetails.id==User.id).filter(UserDetails.id==User.id)
    # SELECT user.username AS user_username, userdetails.id_card AS userdetails_id_card FROM user INNER JOIN userdetails ON userdetails.id = user.id WHERE userdetails.id = user.id if __name__ == '__main__':
    search()

原生sql查询

  •  from databases.config import session
    
     def search():
    sql = 'select * from user '
    result = session.execute(sql)
    result.fetchone()
    result.fetchmany()
    result.fetchone() if __name__ == '__main__':
    search()

SQLAlchemy查询的更多相关文章

  1. tornado 07 数据库—ORM—SQLAlchemy—查询

    tornado 07 数据库—ORM—SQLAlchemy—查询 引言 #上节课使用query从数据库查询到了结果,但是query返回的对象是直接可用的吗 #在query.py内输入一下内容 from ...

  2. sqlalchemy 查询姿势总结

    sqlalchemy查询使用 1.带条件查询 查询是最常用的,对于各种查询我们必须要十分清楚,首先是带条件的查询 #带条件查询 rows = session.query(User).filter_by ...

  3. SQLAlchemy04 /SQLAlchemy查询高级

    SQLAlchemy04 /SQLAlchemy查询高级 目录 SQLAlchemy04 /SQLAlchemy查询高级 1.排序 2.limit.offset和切片操作 3.懒加载 4.group_ ...

  4. SQLAlchemy(四):SQLAlchemy查询高级

    目录 SQLAlchemy04 /SQLAlchemy查询高级 1.排序 2.limit.offset和切片操作 3.懒加载 4.group_by 5.having 6.join 7.subquery ...

  5. 把SQLAlchemy查询对象转换成字典

    1-假设查出来的为单个对象 1-1 在model.py中为模型对象添加字典转换函数: from exts import db class User(db.Model): __tablename__ = ...

  6. sqlalchemy查询结果类型简析

    Sqlalchemy的查询方式有很多种,例如可以查询全部,可以查询符合条件的,可以查询指定字段的.那么这么多种查询,返回的结果是不是一样的呢?作本文记录分析结果. Sql_forengin.py #c ...

  7. 把SQLAlchemy查询对象转换成字典/json使用(分开)

    注:针对的是查询出来的是单条对象 多个对象的话可以使用for循环遍历查询出来的对象列表,也可以使用下面的方法 1.config.py文件 #!/usr/bin/env python #-*- codi ...

  8. 几种常见sqlalchemy查询:

        #简单查询     print(session.query(User).all())     print(session.query(User.name, User.fullname).all ...

  9. 利用sqlalchemy 查询视图

    这个问题 google 百度 中英文搜了一上午.最新的回答还是 7年前.最后自己靠着官方文档的自己改出来一个比较方便的方法 使用环境 python == 3.7.0 SQLAlchemy === 1. ...

随机推荐

  1. java批量处理

    最近用到Java批量处理,一次性处理多个文件夹下的多个文件,在此记录一下. 我的思路:首先要保证文件夹和文件夹下的文件的命名是有规律的,利用for循环,每次自增变量,再拼接字符串,从而得到各个文件的路 ...

  2. .NET Conf: Xamarin专场会议3.23 开幕

    聚焦于 Xamarin 的 NET Conf 是一项免费的为期一天的直播活动,来自社区和.NET产品团队的演讲者正在使用Xamarin技术构建本机移动应用程序!Xamarin允许您使用C#(而不是Ja ...

  3. (转)协议森林15 先生,要点单吗? (HTTP协议概览)

    协议森林15 先生,要点单吗? (HTTP协议概览) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们在TCP流通信中说明了, ...

  4. [Java网络安全系列面试题]常见web攻击有哪些?

    搞Web开发离不开安全这个话题,确保网站或者网页应用的安全性,是每个开发人员都应该了解的事.本篇主要简单介绍在Web领域几种常见的攻击手段及Java Web中的预防方式. 1. XSS 1.1 什么是 ...

  5. macOS开发:调整NSImage尺寸大小

    原文链接 extension NSImage { func resize(_ to: CGSize, isPixels: Bool = false) -> NSImage { var toSiz ...

  6. Dubbo 扩展点加载机制:从 Java SPI 到 Dubbo SPI

    SPI 全称为 Service Provider Interface,是一种服务发现机制.当程序运行调用接口时,会根据配置文件或默认规则信息加载对应的实现类.所以在程序中并没有直接指定使用接口的哪个实 ...

  7. 快速理解编码,unicode与utf-8

    1.为什么编码,因为cpu只认识数字2.ASCII 一个字符共占7位,用一个字节表示,共128个字符3.那么ASCII浪费了最高位多可惜,出现了ISO-8859-1,一个字节,256个字符,很多协议的 ...

  8. spss绘制图形更改组距

    在绘制数据分布条形图时,要更改y轴的刻度很简单,直接在图形编辑窗口点击y轴修改就可以了. 而x轴的间隔自动设置为1,如果想要更改组距,可以按照以下方式: 点击重新编码为不同变量 选择要更改的变量,在[ ...

  9. OpenCV-Python 图像上的算术运算 | 十一

    目标 学习图像的几种算术运算,例如加法,减法,按位运算等. 您将学习以下功能:cv.add,cv.addWeighted等. 图像加法 您可以通过OpenCV函数cv.add()或仅通过numpy操作 ...

  10. coding++ :Layui-form 表单模块

    虽然对layui比较熟悉了,但是今天有时间还是将layui的form表单模块重新看一下. https://www.layui.com/doc/modules/form.html 1):更新渲染 lay ...