美文网首页flask
Flask系列教程(22)——SQLAlchemy的ORM(3)

Flask系列教程(22)——SQLAlchemy的ORM(3)

作者: 编程小蝉 | 来源:发表于2018-06-05 18:32 被阅读76次

    SQLAlchemy的ORM(3)

    如果想深入学习Flask,可以观看这套免费Flask教学视频:零基础:Flask入门到项目实战

    查找方法:

    介绍完过滤条件后,有一些经常用到的查找数据的方法也需要解释一下:

    1. all():返回一个Python列表(list):
    query = session.query(User).filter(User.name.like('%ed%').order_by(User.id)
    # 输出query的类型
    print type(query)
    > <type 'list'>
    # 调用all方法
    query = query.all()
    # 输出query的类型
    print type(query)
    > <class 'sqlalchemy.orm.query.Query'>
    
    1. first():返回Query中的第一个值:
    user = session.query(User).first()
    print user
    > <User(name='ed', fullname='Ed Jones', password='f8s7ccs')>
    
    1. one():查找所有行作为一个结果集,如果结果集中只有一条数据,则会把这条数据提取出来,如果这个结果集少于或者多于一条数据,则会抛出异常。总结一句话:有且只有一条数据的时候才会正常的返回,否则抛出异常:
    # 多于一条数据
    user = query.one()
    > Traceback (most recent call last):
    > ...
    > MultipleResultsFound: Multiple rows were found for one()
    # 少于一条数据
    user = query.filter(User.id == 99).one()
    > Traceback (most recent call last):
    > ...
    > NoResultFound: No row was found for one()
    # 只有一条数据
    > query(User).filter_by(name='ed').one()
    
    1. one_or_none():跟one()方法类似,但是在结果集中没有数据的时候也不会抛出异常。

    2. scalar():底层调用one()方法,并且如果one()方法没有抛出异常,会返回查询到的第一列的数据:

    session.query(User.name,User.fullname).filter_by(name='ed').scalar()
    

    文本SQL:

    SQLAlchemy还提供了使用文本SQL的方式来进行查询,这种方式更加的灵活。而文本SQL要装在一个text()方法中,看以下例子:

    from sqlalchemy import text
    for user in session.query(User).filter(text("id<244")).order_by(text("id")).all():
    print user.name
    

    如果过滤条件比如上例中的244存储在变量中,这时候就可以通过传递参数的形式进行构造:

    session.query(User).filter(text("id<:value and name=:name")).params(value=224,name='ed').order_by(User.id)
    

    在文本SQL中的变量前面使用了:来区分,然后使用params方法,指定需要传入进去的参数。另外,使用from_statement方法可以把过滤的函数和条件函数都给去掉,使用纯文本的SQL:

    sesseion.query(User).from_statement(text("select * from users where name=:name")).params(name='ed').all()
    

    使用from_statement方法一定要注意,from_statement返回的是一个text里面的查询语句,一定要记得调用all()方法来获取所有的值。

    计数(Count):

    Query对象有一个非常方便的方法来计算里面装了多少数据:

    session.query(User).filter(User.name.like('%ed%')).count()
    

    当然,有时候你想明确的计数,比如要统计users表中有多少个不同的姓名,那么简单粗暴的采用以上count是不行的,因为姓名有可能会重复,但是处于两条不同的数据上,如果在原生数据库中,可以使用distinct关键字,那么在SQLAlchemy中,可以通过func.count()方法来实现:

    from sqlalchemy import func
    session.query(func.count(User.name),User.name).group_by(User.name).all()
    # 输出的结果
    > [(1, u'ed'), (1, u'fred'), (1, u'mary'), (1, u'wendy')]
    

    另外,如果想实现select count(*) from users,可以通过以下方式来实现:

    session.query(func.count(*)).select_from(User).scalar()
    

    当然,如果指定了要查找的表的字段,可以省略select_from()方法:

    session.query(func.count(User.id)).scalar()
    

    如果想深入学习Flask,可以观看这套免费Flask教学视频:零基础:Flask入门到项目实战

    </article>

    版权声明: https://blog.csdn.net/huangyong1314/article/details/80555040

    相关文章

      网友评论

        本文标题:Flask系列教程(22)——SQLAlchemy的ORM(3)

        本文链接:https://www.haomeiwen.com/subject/rhymsftx.html