sqlalchemy 三种排序方式详解(上)

网站发布的文章想按发布时间最新排序,还有网站想按点击数量大小进行排序.......排序在网站开发项目中用的非常频繁。下面阿汤哥就为大家讲解下sqlalchemy 三种排序方式。

老规矩,我们先定义一个Arctire模型(代码如下),并映射到数据库中。

class User(Base): 
  __tablename__ = "user" 
  id = Column(Integer , primary_key=True , autoincrement=True)  
  name = Column(String(50) , nullable=False)  
  create_time(DateTime , nullable=False , default=datetime.now)  
  def __repr__(self):  
        return "name:%s,create_time:%s"%(self.name,self.create_time)  
        Base.metadata.drop_all()  
        Base.metadata.create_all()

运行上诉代码,我们试试数据库表是否创建成功(数据库命令行工具输入 show tables,结果如下,说明数据库表创建成功)


因为要做排序,所以数据库表中必须有多条数据才行,我们向表中插入两条数据试试!(代码如下)

user1 = User(name = "jack")  
session.add(user1)
session.commit()

由于我们按时间排序,同时插入两条数据,时间一样,故延时3秒插入另外一条数据

time.sleep(3)
user2 = User(name = "blue")
session.add(user2) 
session.commit()

我们 select 查询下数据是否插入成功!


两条数据插入数据表成功且时间相隔3秒,实现了我们想要的效果。我们先查询下表中所有数据

results = session.query(User).all()  
print(results)

运行上述代码,查询结果如下:


数据的确能查询出来(规律:时间从最小到最大排列),但是现在有新的需求,我想要用户注册时间最近的排在前面,要实现这个效果,怎么办呢?不跟大伙绕弯了,下面就跟大家讲讲我接下来要讲的排序
  
sqlalceemy排序方式有三种,接下来分别讲讲这三种的用法。
  

第一种:直接在查询语句中使用order_by

现在就用第一种方法实现刚才所说(最新注册的用户的拍在前面),最新注册的也就是时间最大的。代码如下

results = session.query(User).order_by(User.create_time.desc()).all() 
print(results)

运行结果如下。


嗯,结果如我们所愿(时间按从大到小排列)。效果是实现了,还有没有其它法子(与此类似,在查询中实现排序)呢????答案是有,下面我们就试试另外一种法子。把表字段名作为字符串放在order_by里面就ok了,说干咱就干!

results = session.query(User).order_by("create_time").all() 
print(results)

估计心急的小伙伴迫不及待试了一遍之后,发现效果和默认查询结果(从小到大)一毛一样,结果如下


是的,没错,我在这挖了个小小的坑!要想实现我们想要的效果,只需在order_by里面的字符串前面加上 - 号就OK了。代码及结果如下


第二种:在定义模型时声明排序方式

有没有小伙伴和我一样,觉得每次在查询中定义排序太费时,太麻烦了。有没有什么更好的办法,让我们查询时自动排序。
  

我们在创建模型时,通过定义一个类属性 __mapper_args__,将其order_by设置为 create_time.desc() 即可,完整代码如下

class User(Base):  
  __tablename__ = "user"  
  id = Column(Integer , primary_key=True , autoincrement=True)  
  name = Column(String(50) , nullable=False)  
  create_time = Column(DateTime , nullable=False , default=datetime.now)
  
  __mapper_args__ = {  
  "order_by":create_time.desc()  
  }  
  def __repr__(self):  
        return "name:%s,create_time:%s"%(self.name,self.create_time)

然后我们再查询下,查询代码如下:

results = session.query(User).all()
print(results)
运行查询代码,结果一样能实现我们想要的效果。
  
还有最后一种排序方式。因为时间关系,我们放到下章单独再讲。



猜你喜欢

转载自blog.csdn.net/aimill/article/details/80812817