最近在写一个cmdb系统的分页,尽管Django本身有分页的模块儿,但是还是想实现一下自己心中想的分页的一种逻辑

因为,在我们工作当中,当我们的数据量超级大的时候,其实我们每次分页查询都不必将所有的数据查询出来,而是可以按阶段的查询,举个例子

每次查询5页数据,当需要第六页的时候,再次进行加载,为了更加明了,做了举例

首先我们规定好每次查询5页,每页4条数据  

  1. db_data = list(range(1,100))
  2.  
  3. final_page = len(db_data)
  4.  
  5. one_page_num = 5 #每页4条
  6. one_time_num = 5 #每次查5页

1、查询索引的逻辑 设定findIndex查询的索引

  1. # page = 1 int(1/5) + 1 findIndex = 1
  2. # page = 2 int(2/5) + 1 findIndex = 1
  3. # page = 3 int(3/5) + 1 findIndex = 1
  4. # page = 4 int(4/5) + 1 findIndex = 1
  5. # page = 5 int(5/5) findIndex = 1
  6. # page = 6 int(6/5) + 1 findIndex = 2
  7. # page = 7 int(7/5) + 1 findIndex = 2
  8. # page = 8 int(8/5) + 1 findIndex = 2
  9. # page = 9 int(9/5) + 1 findIndex = 2
  10. # page = 10 int(10/5) findIndex = 2
  11. # page = 11 int(11/5) + 1 findIndex = 3
  12. # page = 12 int(12/5) + 1 findIndex = 3
  13. # page = 13 int(13/5) + 1 findIndex = 3
  14. # page = 14 int(14/5) + 1 findIndex = 3
  15. # page = 15 int(15/5) findIndex = 3

所以我们可以写如下代码

  1. if page/one_time_num > int(page/one_time_num):
  2. findIndex = int(page / one_time_num) + 1
  3. else:
  4. findIndex = int(page / one_time_num)
  5. #进行第一次查询,查询每次5页,每页4条的数据
  6. select_num = one_time_num * one_page_num #这里决一次定查询20条
  7. select_start = (findIndex - 1) * select_num # 开始查询的索引
  8. select_down = findIndex * select_num # 结束查询的索引
  9. select_data = db_data[select_start: select_down] #这里查询出了一次20条数据

这个时候是查询出20条数据了,但是,我们想要的具体的数据和页码对不上,所以做了以下的数据

  1. #下面对20条数据进行截取
  2. #findIndex 1
  3. # page = 1 1-(0*5) gnPage = 1
  4. # page = 2 2-(0*5) gnPage = 2
  5. # page = 3 3-(0*5) gnPage = 3
  6. # page = 4 4-(0*5) gnPage = 4
  7. # page = 5 5-(0*5) gnPage = 5
  8. #findIndex 2
  9. # page = 6 6-(1*5) gnPage = 1
  10. # page = 7 7-(1*5) gnPage = 2
  11. # page = 8 8-(1*5) gnPage = 3
  12. # page = 9 9-(1*5) gnPage = 4
  13. # page = 10 10-(1*5) gnPage = 5
  14. #findIndex 3
  15. # page = 11 11-(2*5) gnPage = 1
  16. # page = 12 12-(2*5) gnPage = 2
  17. # page = 13 13-(2*5) gnPage = 3
  18. # page = 14 14-(2*5) gnPage = 4
  19. # page = 15 15-(2*5) gnPage = 5

所以我们可以得到以下代码来获取具体的一页数据

  1. #设定 截取的索引位now_index
  2. now_index = page - (findIndex-1)*one_time_num
  3. #设定单页的截取起始
  4. page_start = (now_index - 1) * one_page_num
  5. page_end = now_index * one_page_num
  6. #开始截取
  7. page_data = select_data[page_start:page_end]

最后进行代码结合

  1. #coding:utf-8
  2.  
  3. db_data = list(range(1,100))
  4.  
  5. one_page_num = 5 #每页4条
  6. one_time_num = 5 #每次查5页
  7.  
  8. while True:
  9. page = int(input("page >>>")) #输入页码
  10.  
  11. #查询索引的逻辑 设定findIndex查询的索引
  12. # page = 1 int(1/5) + 1 findIndex = 1
  13. # page = 2 int(2/5) + 1 findIndex = 1
  14. # page = 3 int(3/5) + 1 findIndex = 1
  15. # page = 4 int(4/5) + 1 findIndex = 1
  16. # page = 5 int(5/5) findIndex = 1
  17. # page = 6 int(6/5) + 1 findIndex = 2
  18. # page = 7 int(7/5) + 1 findIndex = 2
  19. # page = 8 int(8/5) + 1 findIndex = 2
  20. # page = 9 int(9/5) + 1 findIndex = 2
  21. # page = 10 int(10/5) findIndex = 2
  22. # page = 11 int(11/5) + 1 findIndex = 3
  23. # page = 12 int(12/5) + 1 findIndex = 3
  24. # page = 13 int(13/5) + 1 findIndex = 3
  25. # page = 14 int(14/5) + 1 findIndex = 3
  26. # page = 15 int(15/5) findIndex = 3
  27.  
  28. if page/one_time_num > int(page/one_time_num):
  29. findIndex = int(page / one_time_num) + 1
  30. else:
  31. findIndex = int(page / one_time_num)
  32. #进行第一次查询,查询每次5页,每页4条的数据
  33. select_num = one_time_num * one_page_num #这里决一次定查询20条
  34. select_start = (findIndex - 1) * select_num # 开始查询的索引
  35. select_down = findIndex * select_num # 结束查询的索引
  36.  
  37. select_data = db_data[select_start: select_down] #这里查询出了一次20条数据
  38.  
  39. #下面对20条数据进行截取
  40. #findIndex 1
  41. # page = 1 1-(0*5) gnPage = 1
  42. # page = 2 2-(0*5) gnPage = 2
  43. # page = 3 3-(0*5) gnPage = 3
  44. # page = 4 4-(0*5) gnPage = 4
  45. # page = 5 5-(0*5) gnPage = 5
  46. #findIndex 2
  47. # page = 6 6-(1*5) gnPage = 1
  48. # page = 7 7-(1*5) gnPage = 2
  49. # page = 8 8-(1*5) gnPage = 3
  50. # page = 9 9-(1*5) gnPage = 4
  51. # page = 10 10-(1*5) gnPage = 5
  52. #findIndex 3
  53. # page = 11 11-(2*5) gnPage = 1
  54. # page = 12 12-(2*5) gnPage = 2
  55. # page = 13 13-(2*5) gnPage = 3
  56. # page = 14 14-(2*5) gnPage = 4
  57. # page = 15 15-(2*5) gnPage = 5
  58. #设定 截取的索引位now_index
  59. now_index = page - (findIndex-1)*one_time_num
  60. #设定单页的截取起始
  61. page_start = (now_index - 1) * one_page_num
  62. page_end = now_index * one_page_num
  63. #开始截取
  64. page_data = select_data[page_start:page_end]
  65. #输出效果
  66. print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
  67. print("当前是第%s次查询"%findIndex)
  68. print("当前查询到的所有数据是 \n %s" % select_data)
  69. print("当前是 %s 页" % page)
  70. print("当前的数据是 \n %s " % page_data)
  71. print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")

大家试一下吧。

基于Python的大数据的分页模型代码的更多相关文章

  1. MySQL大数据量分页查询方法及其优化

    MySQL大数据量分页查询方法及其优化   ---方法1: 直接使用数据库提供的SQL语句---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N---适 ...

  2. 大数据实时处理-基于Spark的大数据实时处理及应用技术培训

    随着互联网.移动互联网和物联网的发展,我们已经切实地迎来了一个大数据 的时代.大数据是指无法在一定时间内用常规软件工具对其内容进行抓取.管理和处理的数据集合,对大数据的分析已经成为一个非常重要且紧迫的 ...

  3. 给Ambari集群里安装基于Hive的大数据实时分析查询引擎工具Impala步骤(图文详解)

    不多说,直接上干货! Impala和Hive的关系(详解) 扩展博客 给Clouderamanager集群里安装基于Hive的大数据实时分析查询引擎工具Impala步骤(图文详解) 参考 horton ...

  4. 【Python开发】Python 适合大数据量的处理吗?

    Python 适合大数据量的处理吗? python 能处理数据库中百万行级的数据吗? 处理大规模数据时有那些常用的python库,他们有什么优缺点?适用范围如何? 需要澄清两点之后才可以比较全面的看这 ...

  5. Python/Numpy大数据编程经验

    Python/Numpy大数据编程经验 1.边处理边保存数据,不要处理完了一次性保存.不然程序跑了几小时甚至几天后挂了,就啥也没有了.即使部分结果不能实用,也可以分析程序流程的问题或者数据的特点.   ...

  6. Access大数据高效分页语句

    Access大数据高效分页语句 oracle的分页查询可以利用rowid伪列. db2的分页查询可以利用row_number() over()聚合函数. mysql有limit. access仿佛先天 ...

  7. 高速基于echarts的大数据可视化

    [Author]: kwu 高速基于echarts的大数据可视化,echarts纯粹的js实现的图表工具.高速开发的过程例如以下: 1.引入echarts的依赖js库 <script type= ...

  8. 软工之词频统计器及基于sketch在大数据下的词频统计设计

    目录 摘要 算法关键 红黑树 稳定排序 代码框架 .h文件: .cpp文件 频率统计器的实现 接口设计与实现 接口设计 核心功能词频统计器流程 效果 单元测试 性能分析 性能分析图 问题发现 解决方案 ...

  9. 黑马基础阶段测试题:创建一个存储字符串的集合list,向list中添加以下字符串:”C++”、”Java”、” Python”、”大数据与云计算”。遍历集合,将长度小于5的字符串从集合中删除,删除成功后,打印集合中的所有元素

    package com.swift; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; ...

随机推荐

  1. 【转】教你怎么调用Gitlab API

    官方文档: https://docs.gitlab.com/ce/api/ https://docs.gitlab.com/ee/api/branches.html#list-repository-b ...

  2. 【转】shell处理mysql增删改查

    这几天做一个任务,比对两个数据表中的数据,昨天用PHP写了一个版本,但考虑到有的机器没有php或者php没有编译mysql扩展,就无法使用mysql系列的函数,脚本就无效了,今天写个shell版本的, ...

  3. Update(Stage4):spark_rdd算子:第1节 RDD_定义_转换算子:深入RDD

    一. 二.案例:详见代码.针对案例提出的6个问题: 假设要针对整个网站的历史数据进行处理, 量有 1T, 如何处理? 放在集群中, 利用集群多台计算机来并行处理 如何放在集群中运行? 简单来讲, 并行 ...

  4. 【PAT甲级】1066 Root of AVL Tree (25 分)(AVL树建树模板)

    题意: 输入一个正整数N(<=20),接着输入N个结点的值,依次插入一颗AVL树,输出最终根结点的值. AAAAAccepted code: #define HAVE_STRUCT_TIMESP ...

  5. windows之杀死端口

    提示: 查询端口 查询pid 杀死任务 通过 cmd 进入控制台: 查询端口: netstat -aon|findstr 1111 查询pid下的任务: tasklist|findstr 6616 杀 ...

  6. Java日期时间API系列9-----Jdk8中java.time包中的新的日期时间API类的Period和Duration的区别

    1.Period final修饰,线程安全,ISO-8601日历系统中基于日期的时间量,例如2年3个月4天. 主要属性:年数,月数,天数. /** * The number of years. */ ...

  7. 软件架构,WEB - REST架构,RESTful API

    参考 https://www.zhihu.com/question/27785028/answer/48096396 wiki太学术化了 http://www.ruanyifeng.com/blog/ ...

  8. MFC加载图片

    目录 1. 自适应方法 2. 加载原图方法 1. 自适应方法 /* 自适应方法 */ CRect rect; CRect rect1; CImage image; //创建图片类 image.Load ...

  9. Educational Codeforces Round 73 (Rated for Div. 2)D(DP,思维)

    #define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;long long a[300007],b[3 ...

  10. Codeforces Global Round 4E(字符串,思维)

    #include<bits/stdc++.h>using namespace std;string s,a,b;int main(){ cin>>s; int n=s.size ...