热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何将python3的flask+mysql的多重循环数据显示在一张表中?

背景:新手上路,第一次用基于python3的flask做web,然后数据库用的mysql目的:有一张人工维护的excel表,横轴是每个月的1-31天,纵轴是参与者名字及月初定的目标,然后每个人
背景:新手上路,第一次用基于python3的flask做web,然后数据库用的mysql

目的:有一张人工维护的excel表,横轴是每个月的1-31天,纵轴是参与者名字及月初定的目标,然后每个人的数据,按天记录在后面,每个人的记录在每个月内一般只有5-15条,有少的可能一个月内只有1-5条



如下:

姓名      |      目标     |    1     |    2    |    3      |     4  |  ......    | 31 |

张三           1000          300                            100              200         

李四            2000                     100                200              100

王五           3000          100       100      100                          200



将以上表的数据转换为mysql的数据库

姓名和目标在一个goals表

姓名和reocrd数据在records表



这些都ok了,flask实现了goals的添加/修改/显示,records的添加/修改/显示

现在对以上表格的web化,不会弄了



flask部分:
先取所有用户的goals dict:      select name,goal from goals  省略转换为dict的代码
然后for循环分别取每个用户的所有records
records dict:    select name,record,day  from records where name =%s  省略转换为dict的代码
这里的问题就是查询了N次了,速度非常慢,如果有几百个用户,那就查询几百次了,先暂时拿一二十个用户实验,就没管这里了,求指点如何优化这里或整体?



jinjia2的web模板中

先固定表头:姓名,目标,接着用for循环生成一个月的31个栏目

内容部分就懵逼了,前面的姓名和目标倒是很简单,后面的records和日期一一对应需要如何实现?

前2项内容:

for   goal in goals:

      goal.name

      goal.goal

后面record和日历的每一天怎么匹配?这里就错了,明显二个for循环不匹配了

for d in range(1,32)

     for    record   in records

            if  record.day == d      // record.day匹配31天中的日期

                            record.record

             else

                        x           //其他需要显示空白

             endif

     endfor

endfor

求指点,应该如何让每个人的record和天数匹配后在31天中正确的时间点显示。

谢谢


11 个解决方案

#1


我的想法, 是生成一个 人数*33 的列表, 第一列是姓名,第二列是目标, 后面31 列对应日期
把所有人和姓名读入,填入第1,2列。 
所有工作数据读入, 按姓名,日期,填入 对应的位置。

最后再显示输出,  输出用  flask 的模板方法。 就是建立个HTML , 数据用{} 标出, 就是类似于 {% for jsfile_name in script_list %}。

#2


感谢回复!
就是如何生成这个人数*33的列表是关键了
1. 人数列循环好处理
2. 以人数列的人名为参数(第一次for循环),循环X遍来读取数据库,遍历出每个人的所有record,有多少人,就得读取执行多少次sql查询
3. 最后将按人名读出来的record(第二次for循环),再按天来循环一次排列(第三次for循环),如果record中的天数和日历数值匹配了,就显示record值,如果不匹配,就显示空白

就是我上面的思路,但是做出来不行,应该是哪里不对,就是第三步,没办法二个循环插入一个横轴中,水平太菜,完全没写过啥代码的菜鸟

#3


2. 以人数列的人名为参数(第一次for循环),循环X遍来读取数据库,遍历出每个人的所有record,有多少人,就得读取执行多少次sql查询
3. 最后将按人名读出来的record(第二次for循环),再按天来循环一次排列(第三次for循环),如果record中的天数和日历数值匹配了,就显示record值,如果不匹配,就显示空白

这个做一次查询即可。
data_array 是大列表   list 是读出来的工作数据 
for l in list:
     //l[0]  是姓名
     for i in range(len(data_array)):
          if data_array[i][0] == l[0]
                 把l 按天数  填入  data_array[i] 


大概思路。慢慢研究

#4


我本身对Django比较熟悉一些,对flask只是如果你用flask难道不用flask-sqlalchemy么?

当然了祼SQL也是可以的。关键是要设计好关系。
按照你的需求你建的库结构应该是这样的

表一、user
id,name,sex, dept, other-info....

表二、record
id, user_id, month, goal, day1, day2, day3, ...., day31

表二的user_id外键关联到表一.id,方式为级联删除。也就是说删除一个表一的user那么他在表二中的所有工作记录也都级联删除。
查询每个月的数据时就会非常方便了,也用不着什么嵌套循环了。

SELECT U.id, U.name, R.goal, R.day1, R.day2...,R.day31 
FROM user AS U LEFT JOIN record AS R ON U.id=R.user_id
WHERE mOnth='2018-03';


#5


引用 3 楼 seakingx 的回复:
2. 以人数列的人名为参数(第一次for循环),循环X遍来读取数据库,遍历出每个人的所有record,有多少人,就得读取执行多少次sql查询
3. 最后将按人名读出来的record(第二次for循环),再按天来循环一次排列(第三次for循环),如果record中的天数和日历数值匹配了,就显示record值,如果不匹配,就显示空白

这个做一次查询即可。
data_array 是大列表   list 是读出来的工作数据 
for l in list:
     //l[0]  是姓名
     for i in range(len(data_array)):
          if data_array[i][0] == l[0]
                 把l 按天数  填入  data_array[i] 


大概思路。慢慢研究


谢谢回复!我研究一下如何搞成一次查询取结果。

另外,您这里的for循环,少了一个生成31天日历的循环,难度横轴要自己手工把31天都列出来?加上这个以后,就是3个for循环了,然后就不能在一个table里显示了。

#6


引用 4 楼 xpresslink 的回复:
我本身对Django比较熟悉一些,对flask只是如果你用flask难道不用flask-sqlalchemy么?

当然了祼SQL也是可以的。关键是要设计好关系。
按照你的需求你建的库结构应该是这样的

表一、user
id,name,sex, dept, other-info....

表二、record
id, user_id, month, goal, day1, day2, day3, ...., day31

表二的user_id外键关联到表一.id,方式为级联删除。也就是说删除一个表一的user那么他在表二中的所有工作记录也都级联删除。
查询每个月的数据时就会非常方便了,也用不着什么嵌套循环了。

SELECT U.id, U.name, R.goal, R.day1, R.day2...,R.day31 
FROM user AS U LEFT JOIN record AS R ON U.id=R.user_id
WHERE mOnth='2018-03';

抱歉,纯菜鸟,不懂flask-sqlalchemy,就是按flask的官方文档写的,把sqllite改成mysql了,我搜一下,哈哈!
试试按您这个方法改一下,这个多次查询也许能解决掉,但主要问题是在table中显示数据就不会头绪了……

#7


另外,每个人的数据不是31天每天都有,只有几天会有,例如一个人只会有5条,打个比方,3号,8号,10号,15号,20号,就没有了,每个人也是没规律的,不能在database查询时直接把31天的record都按顺序查询出来吧?
一个人还好点,要是人多就不行了吧

#8


你的EXCEL里的结构是每个人都有31个值 ,  数据库也可以这样设计, 我觉得鳄鱼大神的思路不错, 和EXCEL一一对应。

这样每个人的数据就是1行。 那些没有数据的, 可以为0。  你在生成表格时, 可以让   内为空。
3次循环生成 大列表

2次循环生成输出的表格。

#9


数据库里按天加31个值,方法倒是笨了点,不过这个好像是可以解决显示的问题……
现在我就是只加了一个值,对应的是date选项,然后就得去判断这个date是否和table里的天数想匹配

#10


敢问大神们,还有更好的办法吗?
不大想在数据库里面挨个把31天都加上,希望能有个更完美的解决办法

#11


Flask的代码:


    cursor.execute('SELECT name, distances from goals where DATE_FORMAT(date, "%Y%m") = DATE_FORMAT(CURDATE(), "%Y%m") ')
    goals = [dict(name=row[0], distances=row[1]) for row in cursor.fetchall()]
    
    monthly = []
    for goal in goals:
        # get month records with name
        sql = 'SELECT name,DATE_FORMAT(date, "%e"),distance FROM records WHERE DATE_FORMAT(date, "%Y%m") = DATE_FORMAT(CURDATE(), "%Y%m") and name = %s order by date'
        cursor.execute(sql, (goal["name"], ))
        records = [dict(name=row[0], day=row[1], distance=row[3]) for row in cursor.fetchall()]
        monthly.append(dict(goal, counts=len(records), records=records))
    #close db
    close_db()
    return render_template('index.html', mOnthly=monthly)




实际的jinjia2 index.html模板:


  
    
    
      ID
      Name
      Distances
      Counts
      
      {% for m in range(1,32) %}
         {{ m }}-Mar
      {% endfor %}

    
    
    
  
  {% for month in monthly %}
  
      
      {{ loop.index }}
      {{ month.name }}
      {{ month.distances }}KM
      {{ month.counts }}

      {% for m in range(1,32) %} 
          {% for record in month.records %}
            {% if record.day == m %}
              {{ record.distance }}
            {% endif %}
            {{ record.day }}
          {% endfor %}
      {% endfor %}

    
  {% else %}
    No record
  {% endfor %}

    
  


推荐阅读
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • React基础篇一 - JSX语法扩展与使用
    本文介绍了React基础篇一中的JSX语法扩展与使用。JSX是一种JavaScript的语法扩展,用于描述React中的用户界面。文章详细介绍了在JSX中使用表达式的方法,并给出了一个示例代码。最后,提到了JSX在编译后会被转化为普通的JavaScript对象。 ... [详细]
author-avatar
toto333
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有