Python/Django 1.5 DatabaseWrapper 线程错误
Posted
技术标签:
【中文标题】Python/Django 1.5 DatabaseWrapper 线程错误【英文标题】:Python/Django 1.5 DatabaseWrapper thread error 【发布时间】: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 下可以正常工作? 【参考方案1】:我在导入 django.* 之前通过猴子补丁解决了这个问题:
import eventlet
eventlet.monkey_patch()
你比我理解这里使用线程。
【讨论】:
很遗憾没有为我工作。我从eventlet.monkey_patch()
更改为 eventlet.monkey_patch(socket=True)
因为我不需要其他任何东西:***.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”
【讨论】:
以上是关于Python/Django 1.5 DatabaseWrapper 线程错误的主要内容,如果未能解决你的问题,请参考以下文章
raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Databas
断言失败: (SourceMgr && "SourceManager not set!") with oclint-json-compilation-databas
sql 查找SQL表大小。取得DB的表大小。来自http://stackoverflow.com/questions/7892334/get-size-of-all-tables-in-databas