修改和查询数据¶
插入、更新、删除¶
有关使用 ORM 修改数据的信息,请参阅 SQLAlchemy 的 ORM 教程 和其他 SQLAlchemy 文档。
要插入数据,请将模型对象传递给 db.session.add()
user = User()
db.session.add(user)
db.session.commit()
要更新数据,请修改模型对象上的属性
user.verified = True
db.session.commit()
要删除数据,请将模型对象传递给 db.session.delete()
db.session.delete(user)
db.session.commit()
修改数据后,必须调用 db.session.commit()
以将更改提交到数据库。否则,它们将在请求结束时被丢弃。
选择¶
有关使用 ORM 查询数据的信息,请参阅 SQLAlchemy 的 查询指南 和其他 SQLAlchemy 文档。
查询通过 db.session.execute()
执行。可以使用 select()
构造查询。执行选择将返回一个 Result
对象,该对象具有许多用于处理返回行的方法。
user = db.session.execute(db.select(User).filter_by(username=username)).scalar_one()
users = db.session.execute(db.select(User).order_by(User.username)).scalars()
视图查询¶
如果您编写 Flask 视图函数,通常可以为缺少的条目返回 404 Not Found
错误。Flask-SQLAlchemy 提供了一些额外的查询方法。
SQLAlchemy.get_or_404()
如果具有给定 ID 的行不存在,将引发 404,否则将返回该实例。SQLAlchemy.first_or_404()
如果查询未返回任何结果,将引发 404,否则将返回第一个结果。SQLAlchemy.one_or_404()
如果查询未返回恰好一个结果,将引发 404,否则将返回该结果。
@app.route("/user-by-id/<int:id>")
def user_by_id(id):
user = db.get_or_404(User, id)
return render_template("show_user.html", user=user)
@app.route("/user-by-username/<username>")
def user_by_username(username):
user = db.one_or_404(db.select(User).filter_by(username=username))
return render_template("show_user.html", user=user)
您可以向 404 错误添加自定义消息
user = db.one_or_404( db.select(User).filter_by(username=username), description=f"No user named '{username}'." )
旧版查询接口¶
您可能会看到使用 Model.query
或 session.query
来构建查询。该查询接口在 SQLAlchemy 中被认为是旧版。优先使用 session.execute(select(...))
。
有关文档,请参见 旧版查询接口。