欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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和切片操作:

 

  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()

 

相关标签: SQLAlchemy