我试图用flask处理消息 Flink ,同时也试图更好地理解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
的更新版本,到目前为止,我已经能够在整个代码中互换使用这两种方法而没有任何问题。
有没有人确切地知道这两个方法有什么不同,如果有区别的话,为什么我会得到不同的结果,我认为这是两行代码,基本上做同样的事情,或者是我的代码的问题,这两个方法是可互换的吗?
2条答案
按热度按时间0yg35tkg1#
如文档中所述,
scalar_one
如果有一个对象则返回一个对象,如果没有结果或有多个结果则引发异常。你想要的可能是scalar_one_or_none
。或者,你可以使用try/except块来代替if
检查。ds97pgxw2#
我想办法解决了。我确实尝试了很多if和try语句,但仍然出现错误。我需要做的是使用
.first()
而不是.scalar-one()
。