2017-03-29 40 views
3

我有一个Web应用程序在我的ubuntu 16 & Nginx + uwsgi上使用SQLAlchemy和MySQL服务器。SQLAlchemy查询返回无

在创建引擎,我把

echo=True 

得到的查询追踪。我有问题的用户注册,每次user_loader被称为在烧瓶登录,我执行:

dbsession.query(User).filter_by(id=user_id).first() 

结果我得到的是:

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) 

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

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

dbsession.query(User).filter_by(id=user_id).first() 

在注册我的代码是:

user = User(name=name, email=email, password=password) 
dbsession.add(user) 
dbsession.commit() 
return redirect(url_for('login')) 

检查已完成确保名称,电子邮件密码有效。

谢谢

+0

请提供[最小,*完整*和*可验证*示例](http://stackoverflow.com/help/mcve)。您的问题可能源于多种原因。例如,MySQL的默认事务隔离级别是[REPEATABLE READ](https://en.wikipedia.org/wiki/Isolation_(database_systems)#Repeatable_reads),因此如果由于任何原因您的事务徘徊不前,您将无法阅读新鲜事数据。什么是“然而,用户ID 61是有效的并且可以被调用。”意思是。它怎么能被“叫”? –

+0

也许是一个错误的数据库? –

+0

@IljaEverilä如果您看到user.id作为61传入(不重要'61'或61)。我试着使用session.execute查询数据库,并返回正确的用户。然而,这个session.query()。first()会一直回应None,有时候会返回一个User对象。如何确保新数据在里面? –

回答

0

解决了这个问题。

感谢@iljaEverila。

基本上我需要确保SQLAlchemy的dbsession持久化数据并且没有挂起的事务。因此,一旦用户注册并user_loader是调用,我只需要调用:

dbsession.commit() 

则调用此:

dbsession.query(User).filter_by(id=user_id).first() 

一定会成功。

谢谢

+0

好,你得到了它,但这是一个更大的问题上的创可贴:为什么你的交易在请求之间“泄漏”。可能是一个配置问题,或者可能是与此相关的东西:http://stackoverflow.com/questions/23301968/invalid-transaction-persisting-across-requests –

+0

也许有点坏主意提交状态,你不在视图中进行控制。回滚将是“更安全”的选择。 –

+0

@IljaEverilä更新我的代码回滚,它工作正常。谢谢!顺便说一句,什么样的配置问题可能会导致泄漏? Cos这是我第一次设置Ubuntu服务器。需要拿起件 –