• tornado 07 数据库—ORM—SQLAlchemy—查询


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

    引言

    #上节课使用query从数据库查询到了结果,但是query返回的对象是直接可用的吗
    #在query.py内输入一下内容
    
    from connect import session
    from user_modules import User
    
    rs = session.query(User).filter(User.username=='xuchengcheng') #根据返回结果来看,rs是一个query对象,打印出来可以看到转化过后的SQL
    # print(rs,type(rs))
    
    print(session.query(User).filter(User.username=='xuchengcheng').all()) #这个返回的是一个list,列表里面是一个类
    
    print(session.query(User).filter(User.username=='xuchengcheng').first()) #这个返回的是一个类的实例化
    
    print(session.query(User)[0]) #索引为0的值,类似于first,但是不等同于,空列表用这个会报错
    
    rs = session.query(User).filter(User.username=='xuchengcheng').all()
    # print(rs) 返回的也是一个列表
    print(rs[0].username)#列表所以为0的类的实例化,然后用点方法来取出username
    print(getattr(rs[0],'username')) #这种方法也可以取出username
    
    rs = session.query(User.username).filter(User.username=='xuchengcheng').all()
    print(rs) #返回[('xuchengcheng',)],在query里面指定了某个属性值,返回的也就不是一个query对象,而是直接查询User.username的值,所以就返回了包括元组的列表
    
    rs = session.query(User.username).filter(User.username=='xuchengcheng').first()
    print(rs) #返回的就是一个元组

    二、条件查询

    #如何通过不同的条件在SQLAlchemy中实现查询
    #过滤函数filter,通俗点讲就是加条件
    #filter是一个过滤函数,过滤条件都可以书写在次函数中,不同的条件之间用逗号隔开
    
    session.query(User).filter(User.username=='xuchengcheng').all()
    
    #filter_by也是一个过滤函数,但是功能弱一点
    session.query(User).filter_by(username='xuchengcheng').all()
    #两者区别
    #1、filter中需要添加类对象,filter_by不需要
    #2、filter_by中只能添加等于的条件,不能添加不等于、大于小于等条件

      快速添加数据

    #中间下面download 
    #1、点击pycharm右边database
    #2、点击绿色加号 DataSource--->MySQL
    #3、Name自定义 ; Host不变   ;Database(数据库):选择需要操作的数据库 mydb ;User:admin  ; Password : 该用户下的密码Root110qwe  
    #4、test connection 测试连接
    #5、apply ---->  OK 
    
    
    #然后可以通过database里面的schemas里面的mysql快速添加内容了;  记得最后操作完点击绿色  ->DB  保存

      条件查询

    #条件查询
    rs = session.query(User).filter(User.username=='xuchengcheng')
    
    #模糊查询
    rs = session.query(User.username).filter(User.username.like('%cheng%')).all() #模糊查询like
    
    rs = session.query(User.username).filter(User.username.notlike('%cheng%')).all()#模糊查询notlike
    
    #精确查询
    rs = session.query(User.username).filter(User.username.is_(None)).all()#精确查询is,需加上 ‘_’
    
    rs = session.query(User.username).filter(User.username.isnot(None)).all() #精确查询isnot
    
    #范围查询
    rs = session.query(User.username).filter(User.username.in_(['xuchengcheng','zhouzhou'])).all() #范围查找in_
    
    rs = session.query(User.username).filter(User.username.notin_(['xuchengcheng','zhouzhou'])).all()#范围查找notin_
    
    #limit,offset,slice
    print(session.query(User.username).limit(3).all()) #从前向后顺序查循前三条
    print(session.query(User.username).offset(2).all()) #偏移2个,前面两个数据不看,从第三个数据开始查询
    print(session.query(User.username).slice(1,3).all()) #切片,索引1到2的数据
    # print(session.query(User.username).filter(User.username=='xuchengcheng').one()) #只能有一个数据,如果有多个xuchengcheng就会报错;可以用来测试是否只有一条
    
    #排序
    from sqlalchemy import desc #desc是需要导入的
    print(session.query(User.username,User.id).filter(User.username!='xuchengcheng').order_by(User.id).all()) #查询不等于xuchengcheng的username,并且根据id的顺序来排序(通过order_by)
    print(session.query(User.username,User.id).filter(User.username!='xuchengcheng').order_by(desc(User.id)).all()) #查询不等于xuchengcheng的username,并且根据id的反序(desc)序来排序
    print(session.query(User.username,User.id).filter(User.username!='xuchengcheng').order_by(User.id).limit(2).all()) #限制数量
    
    #函数
    from sqlalchemy import func,extract #使用函数需要导入这两个
    print(session.query(User.password).group_by(User.password).all()) #分组group_by
    print(session.query(User.password,func.count(User.id)).group_by(User.password).all()) #通过func,函数名的方法来使用函数
    print(session.query(User.password,func.count(User.id)).group_by(User.password).having(func.count(User.password)>1).all()) #having通常与group_by连用,添加条件
    
    #根据创建时间里面的时间来排序
    print(session.query(extract('minute',User.creatime).label('minute'),func.count(User.id)).group_by('minute').all()) #按分钟分组
                    #  extract:从creatime提取出分钟数    label:取别名                         group_by:使用别名

    三、多表查询

    #多表查询
    print(session.query(User,UserDetails).filter(UserDetails.id==User.id).all())  #cross join 查询方法
    print(session.query(User.username,UserDetails.lost_login).join(UserDetails,UserDetails.id==User.id).filter(UserDetails.id==User.id).all()) #inner join 查询方法
          #在mysql里面这两种方法没有区别
    print(session.query(UserDetails.lost_login,User.username).outerjoin(User,User.id==UserDetails.id).filter(UserDetails.id==User.id).all()) #outer join 查询方法
    
    #union 联合查询
    q1 = session.query(User.id)
    q2 = session.query(UserDetails.id)
    q1.union(q2).all()  #联合查询,有去重的功能
    
    #子表查询
    sql_0 = session.query(UserDetails.lost_login).subquery()  #subquery声明子表
    print(session.query(User,sql_0.c.lost_login))  #使用子表查询

    四、原生SQL查询

    #SQLAlchemy虽然可以不用担心SQL问题,但有些情况看上去比较麻烦,这些时候用原生SQL会genjia更加方便
    #原生SQL查询
    sql_1 = """
        select * from `user`  #这里需要用反引号
    """
    row = session.execute(sql_1)
    print(row)
    print(row.fetchone()) #得到一条
    print(row.fetchmany()) #得到一个列表,里面只有一条
    print(row.fetchall())  #得到所有
    for i in row: #得到所有
        print(i)
  • 相关阅读:
    详测 Generics Collections TDictionary(2): ContainsKey、ContainsValue、AddOrSetValue、TryGetValue
    详测 Generics Collections TQueue (3): OnNotify、Extract
    详测 Generics Collections TDictionary(4): OnKeyNotify、OnValueNotify
    详测 Generics Collections TStack(1): Push、Pop、Peek 其他功能同 TQueue
    详测 Generics Collections TDictionary(1): Add、Items、Keys、Values、Remove
    测试字符串写入类: TStringWriter
    在IIS 6 中使用HTTP压缩(Compression)遇到的一个问题
    [好消息]博客园新服务器到货
    [公告]美化家园行动—博客园成立Skin设计小组
    [公告]星期天上午更换新服务器
  • 原文地址:https://www.cnblogs.com/xuchengcheng1215/p/9016980.html
Copyright © 2020-2023  润新知