作业四:使用ORM操作MySQL作业
结合本章课程所学习的内容,参考下面的代码结构,实现一个分页器。传入查询对象,如:stmt = select(Student),需要返回一个分页对象,要求如下:
- 分页器可以自定义页面数据大小,如每页16条数据
- 分页器可以根据需要传递页码并查询数据,如第3页数据,且页码不能超过总页数的范围
- 可以在分页器上查到对应的总记录数data_count()
- 可以在分页器上查到总页数page_count
"""
使用ORM操作MySQL数据库,实现自定义的分页器
"""
class MyPaginator(object):
def __init__(self, stmt, session, page_size=10):
"""
:param stmt: 构造的查询对象
:param session: 使用session来操作数据库
:param page_size: 每一页数据量的大小,默认为10
"""
self.stmt = stmt
self.session = session
self.page_size = page_size
@property
def data_count(self):
""" 总记录数 """
# 代码提示
# select(count()).select_from(stmt)
return 0
@property
def page_count(self):
""" 总页数 """
return 0
def page(self, page=1):
"""
查询当前页的数据
:param page: 当前页码
:return: list[dict])
"""
return []
def main():
""" 测试代码 """
from sqlalchemy import select
from sqlalchemy.orm import Session
from school_models import Student
from db_engine import engine_future as engine
with Session(bind=engine, future=True) as session:
stmt = select(Student)
paginator = MyPaginator(stmt=stmt, session=session, page_size=16)
print('总记录数:', paginator.data_count)
print('总页数:', paginator.page_count)
page = 3
print(f'第{page}页数据为:')
page_data = paginator.page(page=page)
for item in page_data:
print(item)
if __name__ == '__main__':
main()
解答
作业参考代码见资料区代码仓库 homework04.py