两个明显相同的方法给出不同的结果 flask_sqlalchemy

问题描述 投票:0回答:2

我正在尝试使用 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
 的更新版本,到目前为止,我已经能够在我的代码中互换使用两者,没有任何问题。

是否有人确切知道这两种方法有何不同(如果存在差异)以及为什么我得到不同的结果,我认为两行代码基本上做同样的事情,或者是我的代码有问题这两种方法可以互换吗?

python flask flask-sqlalchemy flask-login
2个回答
1
投票

docs中所述scalar_one

如果有一个对象则返回一个对象,如果没有结果或多个结果则引发异常。
你想要的大概是
scalar_one_or_none
。或者,您可以使用 try/except 块代替 
if
 检查。


0
投票
我设法解决了这个问题。我确实尝试了很多 if 和 try 语句,但仍然出现错误。我需要做的是使用 .first() 而不是 .scalar-one()。

© www.soinside.com 2019 - 2024. All rights reserved.