我正在尝试使用 Flask 来处理消息闪烁,并试图从整体上更好地理解 Flask_SQLAlchemy 和 SQL。 如果用户输入了错误的电子邮件地址,我试图让一条消息出现 我已经设法找到一个可行的解决方案,但我很困惑为什么类似的解决方案没有。
@app.route('/login', methods=["GET", "POST"])
def login():
email = request.form.get("email")
password = request.form.get("password")
if request.method == "POST":
user = User.query.filter_by(email=email).first()
if not user:
flash("sorry that email doesn't exist")
return redirect(url_for('login'))
elif not check_password_hash(user.password, password):
flash("Password inccorect pleasew try again")
return redirect(url_for('login'))
else:
login_user(user)
return redirect(url_for('secrets', id=user.id))
return render_template("login.html")
这段代码工作得很好,但当我调整
user = User.query.filter_by(email=email).first()
到
user = db.session.execute(db.select(User).filter_by(email=email)).scalar_one()
所以代码块看起来像这样..
@app.route('/login', methods=["GET", "POST"])
def login():
email = request.form.get("email")
password = request.form.get("password")
if request.method == "POST":
user = db.session.execute(db.select(User).filter_by(email=email)).scalar_one()
if not user:
flash("sorry that email doesn't exist")
return redirect(url_for('login'))
elif not check_password_hash(user.password, password):
flash("Password incorrect please try again")
return redirect(url_for('login'))
else:
login_user(user)
return redirect(url_for('secrets', id=user.id))
return render_template("login.html")
然后代码抛出如下错误
raise exc.NoResultFound(
sqlalchemy.exc.NoResultFound: No row was found when one was required
我知道这个错误是因为没有找到数据库条目而引发的,但是通过阅读文档我被引导相信使用这两种方法之间没有区别并且db.session.execute(db.select())
是只是
User.query
的更新版本,到目前为止,我已经能够在我的代码中互换使用两者,没有任何问题。是否有人确切知道这两种方法有何不同(如果存在差异)以及为什么我得到不同的结果,我认为两行代码基本上做同样的事情,或者是我的代码有问题这两种方法可以互换吗?
docs中所述scalar_one
如果有一个对象则返回一个对象,如果没有结果或多个结果则引发异常。 你想要的大概是
scalar_one_or_none
。或者,您可以使用 try/except 块代替
if
检查。