传统查询界面¶
警告
查询界面在 SQLAlchemy 中被视为传统界面。建议改用 session.execute(select(...))
。
Flask-SQLAlchemy 为每个模型添加了一个 query
对象。这可用于查询给定模型的实例。 User.query
是 db.session.query(User)
的快捷方式。
# get the user with id 5
user = User.query.get(5)
# get a user by username
user = User.query.filter_by(username=username).one()
视图查询¶
如果您编写 Flask 视图函数,通常可为缺失条目返回 404 Not Found
错误。Flask-SQLAlchemy 提供了一些额外的查询方法。
Query.get_or_404()
如果具有给定 ID 的行不存在,将引发 404 错误,否则将返回实例。Query.first_or_404()
如果查询未返回任何结果,将引发 404 错误,否则将返回第一个结果。Query.one_or_404()
如果查询未返回恰好一个结果,将引发 404 错误,否则将返回结果。
@app.route("/user/<username>")
def show_user(username):
user = User.query.filter_by(username=username).one_or_404()
return render_template("show_user.html", user=user)
您可以在 404 错误中添加自定义消息
user = User.query.filter_by(username=username).one_or_404( description=f"No user named '{username}'." )
分页¶
如果您有许多结果,可能只想一次显示一定数量的结果,允许用户点击“下一页”和“上一页”链接来查看数据页面。
在查询上调用 paginate()
以获取 Pagination
对象。有关分页对象的更多信息,请参阅 分页查询结果。
在请求期间,这将从查询字符串 request.args
中获取 page
和 per_page
参数。传递 max_per_page
以防止用户在单页上请求过多结果。如果未给出,则默认值为第 1 页,每页 20 项。
page = User.query.order_by(User.join_date).paginate()
return render_template("user/list.html", page=page)