为了账号安全,请及时绑定邮箱和手机立即绑定

求一段Flask(SQLAlchemy)的代码优化,关于在一个循环里重复select的 .

求一段Flask(SQLAlchemy)的代码优化,关于在一个循环里重复select的 .

沧海一幻觉 2019-04-23 15:18:44
#计算7天内销量,并把每件商品的不同尺码库存分别显示day7=today-datetime.timedelta(days=7)logs7=db.session.execute("SELECTproduct_name,goods_id,sum(number)assellsumFROMsdb_sell_logswherecreatetime>:createtimegroupbygoods_idorderbysum(number)desclimit0,20",{"createtime":datetime_timestamp(day7.strftime("%Y-%m-%d00:00:00"))}).fetchall()goods_store7={}foriteminlogs7:store=db.session.execute("SELECTpdt_desc,storefromsdb_productswheregoods_id=:goods_id",{"goods_id":item.goods_id}).fetchall()item_store=[]forstore_iteminstore:item_store.append([store_item.pdt_desc,store_item.store])goods_store7[item.goods_id]=item_store这段代码要怎么优化请问?感觉这个foriteminlogs7:的循环里要处理N次的select效率好低下。
查看完整描述

2 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

相比程序里面的数据结构操作,数据库操作永远是heavy的如果你的内存足够大,那么可以考虑将7天的rawdata全部select到内存里,然后做各种操作.在内存不够的时候(比如现在的情况改成6个月),你可以将数据分批输出(SELECTLIMIT),在内存里建立好表的模型,进行累加的处理(比如读到一条记录是红色裙子,某月某日出售),就是哪天的红裙子数量++
(这时候充分利用python的字典结构吧,千万别去定义class)总之,不要使用数据库来计算,而是使用代码在内存中计算.另外,在架构构中,这些数据往往不需要在网页中计算,你可以将这个程序做成一个定时的任务,过去7天的报表,每天跑一次或者每周跑一次,然后直接生成一个html文件,甚至结果直接email出去,看需求了.
                            
查看完整回答
反对 回复 2019-04-23
  • 2 回答
  • 0 关注
  • 316 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信