SQLAlchemy(二)

1、排序

设置某个字段默认排序:

__mapper_args__ = {
         "order_by": time #按时间排序
       }

也可以在查询的时候使用order_进行排序

session.query(Article).order_by(Article.id.desc()).all() #desc是降序排序

2、limit、offset和切片操作:

 

  1. limit:可以限制每次查询的时候只查询几条数据。
  2. offset:可以限制查找数据的时候过滤掉前面多少条。
  3. 切片:可以对Query对象使用切片操作,来获取想要的数据。可以使用`slice(start,stop)`方法来做切片操作。也可以使用`[start:stop]`的方式来进行切片操作。示例代码如下:
articles = session.query(Article).order_by(Article.id.desc())[0:10]  # 切片

articles = session.query(Article).limit(10).all()  # 限定取10个

articles = session.query(Article).order_by(Article.id.desc()).offset(90).all()

3、懒加载技术

       在一对多,或者多对多的时候,如果想要获取多的这一部分的数据的时候,往往能通过一个属性就可以全部获取了。比如有一个作者,想要或者这个作者的所有文章,那么可以通过user.articles就可以获取所有的。但有时候我们不想获取所有的数据,比如只想获取这个作者今天发表的文章,那么这时候我们可以给relationship传递一个lazy=dynamic,以后通过user.articles获取到的就不是一个列表,而是一个AppenderQuery对象了。这样就可以对这个对象再进行一层过滤和排序等操作。

        总而言之一句话:如果你在获取数据的时候,想要对多的那一边的数据时,加入这个参数,想要再进行一层过滤,那么就可以使用lazy=dynamic

author = relationship("User", backref=backref("articles", lazy="dynamic"))

user = session.query(User).first()
# 是一个Query对象。

# 可以继续追加数据进去
article = Article(title='XXX')
user.articles.append(article)
session.commit()

4、group_by和having:


①group_by根据某个字段进行分组:

result = session.query(User.age, func.count(User.id)).group_by(User.age).all()  # (年龄,人数),对年龄分组

②having是对查找结果进一步过滤:

#查询年龄大于18的人数
result = session.query(User.age,func.count(User.id)).group_by(User.age).having(User.age>= 18)

5、join

left join(左外连接)和right join(右外连接)以及内连接

# 找到所有的用户,按照发表的文章数量进行排序,query里有什么,就查什么
result = session.query(User, func.count(Article.id)).join(Article).group_by(User.id).order_by(
    func.count(Article.id).desc()).all()



"""
SQL语句:
select user.username,count(article.id) as '文章数' from user join article on 
user.id=article.uid group by user.id order by count(article.id) desc;
"""

6、subquery子查询

子查询可以让多个查询变成一个查询,只要查找一次数据库,性能相对来讲更加高效一点。不用写多个sql语句就可以实现一些复杂的查询。

步骤:
1. 将子查询按照传统的方式写好查询代码,然后在`query`对象后面执行`subquery`方法,将这个查询变成一个子查询。
2. 在子查询中,将以后需要用到的字段通过`label`方法,取个别名。
3. 在父查询中,如果想要使用子查询的字段,那么可以通过子查询的返回值上的`c`属性拿到。

son = session.query(User.city.label("city"),User.age.label("age")).filter(User.username=='tian').subquery()
result = session.query(User).filter(User.city==son.c.city,User.age==son.c.age).all()

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值