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

yi0zb3m4  于 2023-05-05  发布在  Python
关注(0)|答案(2)|浏览(145)

我试图用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的更新版本,到目前为止,我已经能够在整个代码中互换使用这两种方法而没有任何问题。
有没有人确切地知道这两个方法有什么不同,如果有区别的话,为什么我会得到不同的结果,我认为这是两行代码,基本上做同样的事情,或者是我的代码的问题,这两个方法是可互换的吗?

0yg35tkg

0yg35tkg1#

如文档中所述,scalar_one如果有一个对象则返回一个对象,如果没有结果或有多个结果则引发异常。你想要的可能是scalar_one_or_none。或者,你可以使用try/except块来代替if检查。

ds97pgxw

ds97pgxw2#

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

相关问题