SQLAlchemy查询返回无

And*_*aya 6 python mysql sqlalchemy nginx flask-sqlalchemy

我在ubuntu 16和Nginx + uwsgi上有一个使用SQLAlchemy和MySQL-server的Web应用程序。

在创建引擎时,我把

echo=True
Run Code Online (Sandbox Code Playgroud)

获取查询的跟踪。我在注册用户时遇到问题,每次在烧瓶登录时调用user_loader时,我都会执行:

dbsession.query(User).filter_by(id=user_id).first()
Run Code Online (Sandbox Code Playgroud)

我得到的结果是:

INFO sqlalchemy.engine.base.Engine SELECT user.id AS user_id, user.name AS user_name, user.email AS user_email, user.pass$
Mar 29 23:48:56 ubuntu-512mb-sgp1-01 uwsgi[26160]: FROM user
Mar 29 23:48:56 ubuntu-512mb-sgp1-01 uwsgi[26160]: WHERE user.id = %s
Mar 29 23:48:56 ubuntu-512mb-sgp1-01 uwsgi[26160]:  LIMIT %s
Mar 29 23:48:56 ubuntu-512mb-sgp1-01 uwsgi[26160]: 2017-03-29 23:48:56,517 INFO sqlalchemy.engine.base.Engine ('61', 1)
Run Code Online (Sandbox Code Playgroud)

结果为无。但是,在上面的示例中,使用user_id = 61,我可以在ubuntu的mysql shell上找到该用户以获取用户ID 61。

当我刷新页面几次时,结果就会出来。一旦用户完成注册,他们将被重定向到登录页面,完成表单后,它将显示错误“请注册”,如果现在使用此查询找到用户,则会触发该错误:

dbsession.query(User).filter_by(id=user_id).first()
Run Code Online (Sandbox Code Playgroud)

在注册时,我的代码是:

user = User(name=name, email=email, password=password)
dbsession.add(user)
dbsession.commit()
return redirect(url_for('login'))
Run Code Online (Sandbox Code Playgroud)

已进行检查以确保名称,电子邮件密码有效。

谢谢

And*_*aya 3

解决了问题。

感谢@iljaEverila。

基本上我需要确保 SQLAlchemy 的 dbsession 已保存数据并且没有待处理的事务。因此,一旦用户注册并调用 user_loader ,我只需要调用:

dbsession.commit()
Run Code Online (Sandbox Code Playgroud)

然后调用这个:

dbsession.query(User).filter_by(id=user_id).first()
Run Code Online (Sandbox Code Playgroud)

将会成功。

谢谢

  • 很好,你成功了,但这只是一个更大问题的创可贴:为什么你的交易会在请求之间“泄漏”。可能是配置问题,或者可能与此相关:http://stackoverflow.com/questions/23301968/invalid-transaction-persisting-across-requests (2认同)