【问题标题】:SQLAlchemy Query returning NoneSQLAlchemy 查询返回无
【发布时间】: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ä 我添加了更多细节

标签: python mysql nginx sqlalchemy flask-sqlalchemy


【解决方案1】:

解决了这个问题。

感谢@iljaEverila。

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

dbsession.commit()

然后调用这个:

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

会成功的。

谢谢

【讨论】:

  • 很好,你已经开始了,但这是一个更大问题的创可贴:为什么你的交易在请求之间“泄漏”。可能是配置问题,或者可能与此相关:stackoverflow.com/questions/23301968/…
  • 在视图中提交您无法控制的状态也可能有点糟糕。回滚将是“更安全”的选项。
  • @IljaEverilä 将我的代码更新为回滚,它工作正常。谢谢!顺便说一句,什么样的配置问题可能会导致泄漏?因为这是我第一次设置 ubuntu 服务器。需要收拾残局
猜你喜欢
  • 1970-01-01
  • 2020-07-07
  • 1970-01-01
  • 2014-03-13
  • 2014-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多