@magine
2015-02-05T08:15:33.000000Z
字数 888
阅读 961
实习日记
来看一段flask代码:
from flask import request, render_template
from ..models import User, UserLog
app = Flask(__name__)
@app.route('/logs1')
def logs_1():
paginator = log_paginator()
user_ids = {log.user_id for log in paginator.items}
users = {id: User.query.get(id) for id in user_ids}
return render_template('logs.html',
paginator=paginator,
users=users,
)
@app.route('/logs2')
def logs_2():
paginator = log_paginator()
user_ids = {log.user_id for log in paginator.items}
users_q = User.query.filter(User.id.in_(user_ids))
users = {user.id: user for user in users_q}
return render_template('logs.html',
paginator=paginator,
users=users,
)
def log_paginator():
q = UserLog.query.order_by(UserLog.id.desc())
page = force_int(request.args.get('page', 1), 1)
return q.paginate(page, per_page=30)
这是我在公司后台代码中抽出来的一段代码的两个版本,略作了修改。
logs_1()
是我最初写的,logs_2()
是lepture前辈review到我的代码后修改的。
第二种写法明显减少了数据库的查询次数。
这个故事教育我们,不要在循环中查询数据库(get()
),而应对查询数据库的结果(filter_by()
)使用循环。