修改和查询数据

插入、更新、删除

有关使用 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 提供了一些额外的查询方法。

@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.querysession.query 来构建查询。该查询接口在 SQLAlchemy 中被认为是旧版。优先使用 session.execute(select(...))

有关文档,请参见 旧版查询接口