1、 排序:
1. order_by:可以指定根据这个表中的某个字段进行排序,如果在前面加了一个-,代表的是降序排序。
# 排序---根据创建时间排序(create_time)
articles = session.query(Article).order_by(Article.create_time).all()
2. 在模型定义的时候指定默认排序:有些时候,不想每次在查询的时候都指定排序的方式,可以在定义模型的时候就指定排序的方式。有以下两种方式:
* relationship的order_by参数:在指定relationship的时候,传递order_by参数来指定排序的字段。
author = relationship("User",backref=backref("articles",order_by=create_time.desc()))
* 在模型定义中,添加以下代码:
__mapper_args__ = {
"order_by": title
}
即可让文章使用标题来进行排序。
3. 正序排序与倒序排序:默认是使用正序排序。如果需要使用倒序排序,那么可以使用这个字段的`desc()`方法,或者是在排序的时候使用这个字段的字符串名字,然后在前面加一个负号“-”。
# 排序---根据创建时间倒序(create_time)。两张实现方式
# articles = session.query(Article).order_by(Article.create_time.desc()).all()
articles = session.query(Article).order_by("-create_time").all()
完整代码:
#encoding: utf-8
from sqlalchemy import create_engine,Column,Integer,Float,Boolean,DECIMAL,Enum,Date,DateTime,Time,String,Text,func,and_,or_,ForeignKey,Table
from sqlalchemy.dialects.mysql import LONGTEXT
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker,relationship,backref
# 在Python3中才有这个enum模块,在python2中没有
import enum
from datetime import datetime
import random
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'test_flask_learn'
USERNAME = 'root'
PASSWORD = '123456'
# dialect+driver://username:password@host:port/database
DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8mb4".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)
engine = create_engine(DB_URI)
Base = declarative_base(engine)
session = sessionmaker(engine)()
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True, autoincrement=True)
username = Column(String(50),nullable=False)
class Article(Base):
__tablename__ = 'article'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(String(50), nullable=False)
create_time = Column(DateTime,nullable=False,default=datetime.now)
uid = Column(Integer,ForeignKey("user.id"))
author = relationship("User", backref=backref("articles", order_by=create_time.desc()))
# author = relationship("User",backref=backref("articles",order_by=create_time.desc()))
# 在模型定义的时候指定默认排序
# __mapper_args__ = {
# "order_by": create_time.desc()
# }
def __repr__(self):
return "<Article(title:%s,create_time:%s)>" % (self.title,self.create_time)
# Base.metadata.drop_all()
# Base.metadata.create_all()
# 自己添加几条数据
# article1 = Article(title='title2')
# user = User(username='bj2')
# user.articles = [article1]
# session.add(user)
# session.commit()
#
# 排序---根据创建时间排序(create_time)
# articles = session.query(Article).order_by(Article.create_time).all()
# 排序---根据创建时间倒序(create_time)。两张实现方式
# articles = session.query(Article).order_by(Article.create_time.desc()).all()
# articles = session.query(Article).order_by("-create_time").all()
# print(articles)
2、limit、offset和切片操作:
1. limit:可以限制每次查询的时候只查询几条数据。
# limit的使用
articles = session.query(Article).limit(10).all()
2. offset:可以限制查找数据的时候过滤掉前面多少条。
# offset的使用。如offset(8),过滤前面8条数据,从第9掉数据开始
articles = session.query(Article).limit(10).offset(8).all()
3. 切片:可以对Query对象使用切片操作,来获取想要的数据。可以使用`slice(start,stop)`方法来做切片操作。也可以使用`[start:stop]`的方式来进行切片操作。一般在实际开发中,中括号的形式是用得比较多的。希望大家一定要掌握。示例代码如下:
articles = session.query(Article).order_by(Article.id.desc())[0:10]
完整代码:
from sqlalchemy import create_engine,Column,Integer,Float,Boolean,DECIMAL,Enum,Date,DateTime,Time,String,Text,func,and_,or_,ForeignKey,Table
from sqlalchemy.dialects.mysql import LONGTEXT
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker,relationship,backref
# 在Python3中才有这个enum模块,在python2中没有
import enum
from datetime import datetime
import random
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'test_flask_learn'
USERNAME = 'root'
PASSWORD = '123456'
# dialect+driver://username:password@host:port/database
DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8mb4".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)
engine = create_engine(DB_URI)
Base = declarative_base(engine)
session = sessionmaker(engine)()
class Article(Base):
__tablename__ = 'article'
id = Column(Integer,primary_key=True,autoincrement=True)
title = Column(String(50),nullable=False)
create_time = Column(DateTime,default=datetime.now)
def __repr__(self):
return "<Article(title: %s)>" % self.title
# Base.metadata.drop_all()
# Base.metadata.create_all()
#
# 添加100条数据
# for x in range(100):
# title = "title %s" % x
# article = Article(title=title)
# session.add(article)
# session.commit()
# limit的使用
# articles = session.query(Article).limit(10).all()
# print(articles)
# offset的使用。如offset(8),过滤前面8条数据,从第9掉数据开始
# articles = session.query(Article).limit(10).offset(8).all()
# print(articles)
# 切片操作。根据Article的id倒序排序,切片99--90条数据
articles = session.query(Article).order_by(Article.id.desc())[0:10]
print(articles)