[关闭]
@magine 2015-02-05T08:15:33.000000Z 字数 888 阅读 961

实习日记 2015年2月4日(减少数据库的访问)

实习日记


来看一段flask代码:

  1. from flask import request, render_template
  2. from ..models import User, UserLog
  3. app = Flask(__name__)
  4. @app.route('/logs1')
  5. def logs_1():
  6. paginator = log_paginator()
  7. user_ids = {log.user_id for log in paginator.items}
  8. users = {id: User.query.get(id) for id in user_ids}
  9. return render_template('logs.html',
  10. paginator=paginator,
  11. users=users,
  12. )
  13. @app.route('/logs2')
  14. def logs_2():
  15. paginator = log_paginator()
  16. user_ids = {log.user_id for log in paginator.items}
  17. users_q = User.query.filter(User.id.in_(user_ids))
  18. users = {user.id: user for user in users_q}
  19. return render_template('logs.html',
  20. paginator=paginator,
  21. users=users,
  22. )
  23. def log_paginator():
  24. q = UserLog.query.order_by(UserLog.id.desc())
  25. page = force_int(request.args.get('page', 1), 1)
  26. return q.paginate(page, per_page=30)

这是我在公司后台代码中抽出来的一段代码的两个版本,略作了修改。
logs_1()是我最初写的,logs_2()是lepture前辈review到我的代码后修改的。
第二种写法明显减少了数据库的查询次数。

这个故事教育我们,不要在循环中查询数据库(get()),而应对查询数据库的结果(filter_by())使用循环。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注