SQLAlchemy(二)
程序员文章站
2024-03-02 21:59:40
...
1、排序
设置某个字段默认排序:
__mapper_args__ = {
"order_by": time #按时间排序
}
也可以在查询的时候使用order_进行排序
session.query(Article).order_by(Article.id.desc()).all() #desc是降序排序
2、limit、offset和切片操作:
- limit:可以限制每次查询的时候只查询几条数据。
- offset:可以限制查找数据的时候过滤掉前面多少条。
- 切片:可以对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()