【问题标题】:Python/Django 1.5 DatabaseWrapper thread errorPython/Django 1.5 DatabaseWrapper 线程错误
【发布时间】:2013-04-19 16:53:57
【问题描述】:

当我运行服务器并尝试加载 Web 应用程序的本地版本时,在 Django 1.5.1(和 1.5.0)和 mysql 中引发以下 DatabaseError:

DatabaseError at /

在线程中创建的DatabaseWrapper 对象只能在该线程中使用 相同的线程。别名为“default”的对象是在线程 ID 中创建的 4365488128,这是线程 ID 140735183980896。

异常位置如下:

/Users/USERNAME/.envs/PROJECT_NAME/lib/python2.7/site-packages/django/db/backends/init.py 在 validate_thread_sharing 中,第 154 行

这只发生在第一个页面加载时。当我点击刷新时,Web 应用程序按预期加载。当我更改 Django/python 代码并且本地服务器需要重新验证时,错误返回。发生这种情况时,第一次加载会再次引发 DatabaseError,而后续加载再次不会。

这个问题只发生在我的 Django 1.5 项目中。我已经卸载了 mysql 并清除了位于 /usr/local/var/mysql 中的 mysql 二进制文件。全新安装 mysql 并没有解决这个问题。

此处讨论了类似的 DatabaseError,但我无法遵循他们的解决方案:

https://code.djangoproject.com/ticket/17998

我在这里不知所措,任何想法或专业知识将不胜感激。谢谢。

【问题讨论】:

  • 你的代码使用线程吗?
  • 我没有接触线程,不。基本的 Django 安装,基本的 MySQL 使用。
  • 代码在哪个版本的 Django 下可以正常工作?

标签: python mysql django python-2.7 django-1.5


【解决方案1】:

我在导入 django.* 之前通过猴子补丁解决了这个问题:

import eventlet
eventlet.monkey_patch()

你比我理解这里使用线程。

【讨论】:

  • 很遗憾没有为我工作。我从 eventlet.monkey_patch() 更改为 eventlet.monkey_patch(socket=True) 因为我不需要其他任何东西:stackoverflow.com/a/22096841/5421745
  • 如果您正在编写自定义管理命令,“monkey_patch”需要进入您的 .manage.py 文件,或者它的副本。
【解决方案2】:

这是针对1.4的,但是问题的原因可能和你的一样:

https://bitbucket.org/akoha/django-digest/issue/10/conflict-with-global-databasewrapper

该帖子中有两种可能的解决方案,尽管两者似乎都是解决方法:

“我已经能够通过在 db.py 中注释掉 close_connection 来解决问题”

“一个肯定会起作用的修复方法是用 django.db.connection 和 django.db.tranasction 替换 MultiDb/get_default_db()/self.db,如记录在:https://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 2013-02-13
    • 2013-02-25
    • 2013-02-17
    相关资源
    最近更新 更多