sqlalchemy查询使用

1.带条件查询

查询是最常用的,对于各种查询我们必须要十分清楚,首先是带条件的查询

#带条件查询
rows = session.query(User).filter_by(username='jingqi').all()
print(rows)
rows1 = session.query(User).filter(User.username=='jingqi').all()
print(rows1)
rows2 = session.query(User.username).filter(User.username=='jingqi').all()
print(rows2)
rows3 = session.query(User.username).filter(User.username=='jingqi')
print(rows3)

filter_byfilter都是过滤条件,只是用法有区别filter_by里面不能用!= 还有> < 等等,所有filter用得更多,filter_by只能用=

前两个查询的是User,所以返回结果也是一个对象,但是rows2查询的是属性值,所以返回的是属性值。

rows3可以看到SQLAlchemy 转成的SQL语句,SQLAlchemy最后都是会转成SQL语句,通过这个方法可以查看原生SQL,甚至有些时候我们需要把SQLAlchemy转成的SQL交给DBA审查,合适的才能使用。

查询要知道查询结果的返回怎样的数据

print( session.query(User).filter(User.username=='jingqi').all() )
print( session.query(User).filter(User.username=='jingqi').first())
print( session.query(User).filter(User.username=='jingqi').one())#结果为一个时正常,多了就报错
print( session.query(User).get(2))#通过id查询

上面三条记录,第一个查出所有符合条件的记录,第二个查出所有符合记录的第一条记录,第三个返回一个对象,如果结果有多条就会报错,第四个通过主键获取记录


2.限制返回的结果数量

#限制查询返回结果
print( session.query(User).filter(User.username!='jingqi').limit(2).all())
print( session.query(User).filter(User.username!='jingqi').offset(2).all())
print( session.query(User).filter(User.username!='jingqi').slice(2,3).all())
#可以排序之后再进行限制
from sqlalchemy import desc
print( session.query(User).filter(User.username!='budong').order_by(User.username).all())
print( session.query(User).filter(User.username!='budong').order_by(desc(User.username)).slice(1,3).all())

第一个是限制返回条数,从第一条开始;第二个是从第三条开始返回查询结果;第三个是切片返回记录。

order_by默认是顺序,desc是降序。


3.带条件查询

#不等于
print( session.query(User).filter(User.username!='jingqi').all() )
#模糊匹配 like
print( session.query(User).filter(User.username.like('jingqi')).all() )
print( session.query(User).filter(User.username.notlike('jingqi')).all() )
#成员属于 in_
print( session.query(User).filter(User.username.in_(['jingqi','jingqi1'])).all() )
#成员不属于 notin_
print( session.query(User).filter(User.username.notin_(['jingqi','jingqi2'])).all() )
#空判断
print( session.query(User).filter(User.username==None).all() )
print( session.query(User).filter(User.username.is_(None)).all() )
print( session.query(User).filter(User.username.isnot(None)).all() )
#多条件
print( session.query(User).filter(User.username.isnot(None),User.password=='qwe123').all() )
#选择条件
from sqlalchemy import or_,and_,all_,any_
print( session.query(User).filter(or_(User.username=='jingqi',User.password=='qwe123')).all() )
print( session.query(User).filter(and_(User.username=='jingqi2',User.password=='111')).all() ) 以上是各种带条件的查询,大家知道怎么使用,但是需要注意的是,所以的模糊匹配是十分耗费时间的,能不用就尽量不要用。

4.聚合函数的使用

from sqlalchemy import func,extract
print( session.query(User.password,func.count(User.id)).group_by(User.password).all() )
print( session.query(User.password,func.count(User.id)).group_by(User.password).having(func.count(User.id)>1).all() )
print( session.query(User.password,func.sum(User.id)).group_by(User.password).all() )
print( session.query(User.password,func.max(User.id)).group_by(User.password).all() )
print( session.query(User.password,func.min(User.id)).group_by(User.password).all() )
#使用extract提取时间中的分钟或者天来分组
print( session.query(extract('minute', User.creatime).label('minute'),func.count('*').label('count')).group_by('minute').all() )
print( session.query(extract('day', User.creatime).label('day'),func.count('*').label('count')).group_by('day').all() )

这里只是告诉大家的用法,其中group_by是分组,如果要使用聚合函数,就必须导入func,label是取别名的意思 。


5.表关系查询

对于有表关系的,也有些不同的查询,首先我们来建立一个有外键关系的表

from sqlalchemy.orm import relationship
from sqlalchemy import ForeignKey class UserDetails(Base):
__tablename__ = 'user_details'
id = Column(Integer,primary_key=True,autoincrement=True)
id_card = Column(Integer,nullable=False,unique=True)
lost_login = Column(DateTime)
login_num = Column(Integer,default=0)
user_id = Column(Integer,ForeignKey('user.id')) userdetail_for_foreignkey = relationship('User',backref='details',uselist=False,cascade='all') def __repr__(self):
return '<UserDetails(id=%s,id_card=%s,lost_login=%s,login_num=%s,user_id=%s)>'%(
self.id,
self.id_card,
self.login_login,
self.login_num,
self.user_id
)

这里要注意relationship默认是一对多的关系,使用uselist=False则表示一对一的关系,cascade 是自动关系处理,就和MySQL中的ON DELETE类似,但是有区别,参数选项如下:

cascade 所有的可选字符串项是:

  • all , 所有操作都会自动处理到关联对象上.
  • save-update , 关联对象自动添加到会话.
  • delete , 关联对象自动从会话中删除.
  • delete-orphan , 属性中去掉关联对象, 则会话中会自动删除关联对象.
  • merge , session.merge() 时会处理关联对象.
  • refresh-expire , session.expire() 时会处理关联对象.
  • expunge , session.expunge() 时会处理关联对象.

有如上的表关系之后,查询可以十分方便


#表关系查询
row = session.query(UserDetails).all()
print(row,dir(row[0]))
row = session.query(User).filter(User.id==1).first()
print(row,dir(row))
print(row.details)
print(row.details[0].lost_login)

relationship会在User表里面添加一个属性,通过这个属性就可以查询对应的user_details表中的所有字段。省去了很多的代码。


6.多表查询

多表查询也是必须要掌握的知识点。以下是常见的几种表关联方式,需要熟练掌握。

#多表查询
print( session.query(UserDetails,User).all() ) #这个是 cross join
print( session.query(UserDetails,User).filter(User.id==UserDetails.id).all() ) #这是也是cross join 但是加上了where条件 print( session.query(User.username,UserDetails.lost_login).join(UserDetails,UserDetails.id==User.id).all() ) #这个是inner join print( session.query(User.username,UserDetails.lost_login).outerjoin(UserDetails,UserDetails.id==User.id).all() ) #这个才是左连接,sqlalchemy没有右连接 q1 = session.query(User.id)
q2 = session.query(UserDetails.id)
print(q1.union(q2).all()) #这个是union关联

7.子表查询

from sqlalchemy import all_,any_
sql_0 = session.query(UserDetails.lost_login).subquery() #这是声明一个子表
print( session.query(User).filter((User.creatime > all_(sql_0)) ).all() )
print( session.query(User).filter((User.creatime > any_(sql_0)) ).all() )

注意any_all_的区别,all_要求的是所有都满足,any_只需要有满足的就行。


8.原生SQL的查询以及其他使用

再次强调,使用ORM或者原生SQL没有绝对那个好一点,怎么方便怎么使用。

#第一步写好原生的sql,如果需要传递参数,可以使用字符串拼接的方式
sql_1 = """
select * from `user`
"""
#第二步执行,得到返回的结果
row = session.execute(sql_1)
print(row,dir(row))
#第三步,自己控制得到数据的方式
print( row.fetchone() )
print( row.fetchmany() )
print( row.fetchall() )
#也可以循环获得
for i in row:
print('===',i)

9.分页查询

flask_sqlalchemy.BaseQuery#paginate 中提供了封装好的paginate分页函数,若只是使用SQLAlchemy则没有这个方法,可以通过属性绑定到SQLAlchemy上,参考: https://blog.csdn.net/guoqianqian5812/article/details/78860572

session.query.filter(statment).order_by(session.create_time.desc()).paginate(int(page), int(per_page), False)

sqlalchemy 查询姿势总结的更多相关文章

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

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

  2. SQLAlchemy查询

    SQLAlchemy查询 结果查询: from databases.wechat import User from config import session def search(): result ...

  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. Android(java)学习笔记61:Android中的 Application类用法

    1. 简介 如果想在整个应用中使用全局变量,在java中一般是使用静态变量,public类型:而在android中如果使用这样的全局变量就不符合Android的框架架构,但是可以使用一种更优雅的方式就 ...

  2. 了解iOS上的可执行文件和Mach-O格式

    http://www.cocoachina.com/mac/20150122/10988.html http://www.reinterpretcast.com/hello-world-mach-o ...

  3. 种类并查集,Poj(1703)

    题目链接:http://poj.org/problem?id=1703 第一次做种类并查集,有的地方还不是很清楚,想了一上午,有点明白了,这里记录一下. 这里我参考的红黑联盟的题解. 关键:种类并查集 ...

  4. P1424 小鱼的航程(改进版)

    题目背景 原来的题目太简单,现改进让小鱼周末也休息,请已经做过重做该题. 题目描述 有一只小鱼,它上午游泳150公里,下午游泳100公里,晚上和周末都休息(实行双休日),假设从周x(1<=x&l ...

  5. kiiti分割的数据及其处理

    kitti和cityscape的gt的分割不太一样,下边缘不再是从黑色开始的,而是直接是类别 red,green,blue = img_gt[i,j] 1.道路的颜色(紫色):128 64 128 2 ...

  6. 使用QT开发GoogleMap瓦片显示和下载工具(1)——QT开发环境准备

    由于是第一次使用qt,光是QT的安装和调试就费了好大功夫,汗一个,下面记录下过程和遇到的问题的解决方法吧. 下载QT 直接Google搜索“QT”,进入官网http://qt-project.org/ ...

  7. Aspects– iOS的AOP面向切面编程的库

    简介 一个简洁高效的用于使iOS支持AOP面向切面编程的库.它可以帮助你在不改变一个类或类实例的代码的前提下,有效更改类的行为.比iOS传统的 AOP方法,更加简单高效.支持在方法执行的前/后或替代原 ...

  8. Python 初始—(文件操作)

    文件修改,我们可以不用讲一个文件全部都进行读取,然后放入内存,如果文件过大,容易造成内存的 内存溢出问题 因此我们可以便读取边进行修改操作 f=open("old.txt",&qu ...

  9. js、jquery中全局替换replace

    str.replace(/需要替换的/g,"新字符串") //此处使用正则表达式

  10. springboot整合mybatis笔记

    1首先创建一个springboot项目 创建项目的文件结构以及jdk的版本 选择项目所需要的依赖 之后点击finish,完成创建 2以下是文件结构 看一下啊pom.xml; <?xml vers ...