python框架------Flask基础教程--4.4 查找操作
查找操作
一、query可用参数:
- 模型对象。指定查找这个模型中所有的对象。
- 模型中的属性。可以指定只查找某个模型的其中几个属性。
- 聚合函数。
func.count
:统计行的数量。func.avg
:求平均值。func.max
:求最大值。func.min
:求最小值。func.sum
:求和。
二、过滤条件:
过滤是数据提取的一个很重要的功能,以下对一些常用的过滤条件进行解释,并且这些过滤条件都是只能通过filter
方法实现的:
-
equals
:query.filter(User.name == 'ed')
-
not equals
:query.filter(User.name != 'ed')
-
like
:query.filter(User.name.like('%ed%'))
-
in
:query.filter(User.name.in_(['ed','wendy','jack'])) # 同时,in也可以作用于一个Query query.filter(User.name.in_(session.query(User.name).filter(User.name.like('%ed%'))))
-
not in
:query.filter(~User.name.in_(['ed','wendy','jack']))
-
is null
:query.filter(User.name==None) # 或者是 query.filter(User.name.is_(None))
-
is not null
:query.filter(User.name != None) # 或者是 query.filter(User.name.isnot(None))
-
and
:from sqlalchemy import and_ query.filter(and_(User.name=='ed',User.fullname=='Ed Jones')) # 或者是传递多个参数 query.filter(User.name=='ed',User.fullname=='Ed Jones') # 或者是通过多次filter操作 query.filter(User.name=='ed').filter(User.fullname=='Ed Jones')
-
or
:from sqlalchemy import or_ query.filter(or_(User.name=='ed',User.name=='wendy'))
三、查找方法:
介绍完过滤条件后,有一些经常用到的查找数据的方法也需要解释一下:
-
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'>
-
first()
:返回Query
中的第一个值:点击查看代码
user = session.query(User).first() print user >>> <User(name='ed', fullname='Ed Jones', password='f8s7ccs')>
-
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()
-
one_or_none()
:跟one()
方法类似,但是在结果集中没有数据的时候也不会抛出异常。 -
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()