作者:toto333 | 来源:互联网 | 2023-08-31 18:06
背景:新手上路,第一次用基于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 个解决方案
我的想法, 是生成一个 人数*33 的列表, 第一列是姓名,第二列是目标, 后面31 列对应日期
把所有人和姓名读入,填入第1,2列。
所有工作数据读入, 按姓名,日期,填入 对应的位置。
最后再显示输出, 输出用 flask 的模板方法。 就是建立个HTML , 数据用{} 标出, 就是类似于 {% for jsfile_name in script_list %}。
感谢回复!
就是如何生成这个人数*33的列表是关键了
1. 人数列循环好处理
2. 以人数列的人名为参数(第一次for循环),循环X遍来读取数据库,遍历出每个人的所有record,有多少人,就得读取执行多少次sql查询
3. 最后将按人名读出来的record(第二次for循环),再按天来循环一次排列(第三次for循环),如果record中的天数和日历数值匹配了,就显示record值,如果不匹配,就显示空白
就是我上面的思路,但是做出来不行,应该是哪里不对,就是第三步,没办法二个循环插入一个横轴中,水平太菜,完全没写过啥代码的菜鸟
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]
大概思路。慢慢研究
另外,每个人的数据不是31天每天都有,只有几天会有,例如一个人只会有5条,打个比方,3号,8号,10号,15号,20号,就没有了,每个人也是没规律的,不能在database查询时直接把31天的record都按顺序查询出来吧?
一个人还好点,要是人多就不行了吧
你的EXCEL里的结构是每个人都有31个值 , 数据库也可以这样设计, 我觉得鳄鱼大神的思路不错, 和EXCEL一一对应。
这样每个人的数据就是1行。 那些没有数据的, 可以为0。 你在生成表格时, 可以让
| 内为空。
3次循环生成 大列表
2次循环生成输出的表格。
数据库里按天加31个值,方法倒是笨了点,不过这个好像是可以解决显示的问题……
现在我就是只加了一个值,对应的是date选项,然后就得去判断这个date是否和table里的天数想匹配
敢问大神们,还有更好的办法吗?
不大想在数据库里面挨个把31天都加上,希望能有个更完美的解决办法