SQLAlchemy 查询返回无
Posted
技术标签:
【中文标题】SQLAlchemy 查询返回无【英文标题】:SQLAlchemy Query returning None 【发布时间】:2017-08-23 16:33:07 【问题描述】:我在我的 ubuntu 16 和 nginx + uwsgi 上有一个使用 SQLAlchemy 和 mysql-server 的 Web 应用程序。
在创建引擎时,我把
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'))
已完成检查以确保姓名、电子邮件密码有效。
谢谢
【问题讨论】:
请提供minimal, complete, and verifiable example。您的问题可能源于多种原因。例如 MySQL 的默认事务隔离级别是REPEATABLE READ,因此如果由于任何原因您的事务滞留,您将无法读取新数据。 “但是,用户 id 61 是有效的,可以调用”是什么意思。确切的意思。怎么能“叫”呢? 可能是一个错误的数据库? @IljaEverilä 如果您看到 user.id 作为 61 传入(与“61”或 61 无关)。我尝试使用 session.execute 查询数据库,它返回正确的用户。然而,这个 session.query().first() 不断返回 None ,有时是一个 User 对象。如何确保新鲜数据在里面? 创建一个连贯的示例,复制您问题中观察到的行为。不要在 cmets 中删除单行代码。您尝试使用session.execute()
在哪里查询它?在壳里?有时是什么意思?对您的网络服务器的不同请求?如果您想要正确的答案,请提供正确的步骤来重现问题。这些类型的问题往往与访问错误的数据库、未及时提交等有关。
@IljaEverilä 我添加了更多细节
【参考方案1】:
解决了这个问题。
感谢@iljaEverila。
基本上我需要确保来自 SQLAlchemy 的 dbsession 已经保存了数据并且没有待处理的事务。因此,一旦用户注册并调用 user_loader,我只需要调用:
dbsession.commit()
然后调用这个:
dbsession.query(User).filter_by(id=user_id).first()
会成功的。
谢谢
【讨论】:
很好,你已经开始了,但这是一个更大问题的创可贴:为什么你的交易在请求之间“泄漏”。可能是配置问题,或者可能与此相关:***.com/questions/23301968/… 在视图中提交您无法控制的状态也可能有点糟糕。回滚将是“更安全”的选项。 @IljaEverilä 将我的代码更新为回滚,它工作正常。谢谢!顺便说一句,什么样的配置问题可能会导致泄漏?因为这是我第一次设置 ubuntu 服务器。需要收拾残局以上是关于SQLAlchemy 查询返回无的主要内容,如果未能解决你的问题,请参考以下文章
python flask orm sqlalchemy 实例