前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >调试PyPy运行Django出现的错误:Segmentation fault

调试PyPy运行Django出现的错误:Segmentation fault

作者头像
the5fire
发布2019-02-28 17:37:03
2.2K0
发布2019-02-28 17:37:03
举报

前两天在家研究了下pypy,顺便也搭建了一个基于pypy的virtualenv环境: 创建基于pypy的virtualenv虚拟环境 ,在上篇文章最后说到在用django处理mysql数据库的时候会出现这个错误,然后崩溃:Segmentation fault (core dumped)。经过这两天使用pdb进行一步步debug,终于发现问题所在了。

从一个 python manage.py sql blog 开始,阅读了大部分的 django.db.backends.mysql 的代码,稍带着也看了MySQLdb库的一些代码,终于最后找到了问题所在。

在这个过程中,不断的对比Django中的cursor和正常情况下直接用MySQL代码创建的cursor,发现没有太多的区别,Django中的cursor其实是对MySQLdb创建出来的cursor的包装—— CursorWrapperCursorDebugWrapper (位于: django.db.backends.util ) ,其中后面这个CursorDebugWrapper和django_debug_toolbar有很重要的关系,这里面计算了每个连接的执行SQL语句以及每个语句的执行时间。而其他的cursor的操作没有什么特别的地方。

有逻辑的推敲代码还是很重要的,通过短路法不断的尝试,最后终于定位到了是Django在创建一个connection时发生的错误。查错的方法很简单,在pdb下,在Django创建完成一个connection之后,手动创建cursor,然后执行查询,发现直接抛错了。这说明这个connection创建的有问题。(文件位于: django.db.backends.mysql.base 中)

看一下这个connection的创建过程:

.. code::

代码语言:javascript
复制
# ....省略代码
kwargs = {
    'conv': django_conversions,
    #'charset': 'utf8',
    #'use_unicode': True,
}
settings_dict = self.settings_dict
if settings_dict['USER']:
kwargs['user'] = settings_dict['USER']
if settings_dict['NAME']:
kwargs['db'] = settings_dict['NAME']
if settings_dict['PASSWORD']:
kwargs['passwd'] = force_str(settings_dict['PASSWORD'])
if settings_dict['HOST'].startswith('/'):
kwargs['unix_socket'] = settings_dict['HOST']
elif settings_dict['HOST']:
kwargs['host'] = settings_dict['HOST']
if settings_dict['PORT']:
kwargs['port'] = int(settings_dict['PORT'])
# We need the number of potentially affected rows after an
# "UPDATE", not the number of changed rows.
kwargs['client_flag'] = CLIENT.FOUND_ROWS
kwargs.update(settings_dict['OPTIONS'])
t_kwargs = {}
import pdb;pdb.set_trace()
#self.connection = Database.connect(db='django5',host='127.0.0.1',user='root',passwd='root')
self.connection = Database.connect(**kwargs)

# ... 省略代码

尝试后发现去掉创建链接时 charset和use_unicode的参数创建就能成功。

到此为止问题已经找出来了。至于这俩参数的具体用处,下回再说。

最后补充一句,Django没必要同时设置charset和use_unicode,因为MySQLdb库中有对应的判定:

.. code:: python

代码语言:javascript
复制
    charset = kwargs2.pop('charset', '')

    if charset:
        use_unicode = True
    else:
        use_unicode = False

当然,除非你设置charset后需要设置use_unicode为false:

.. code:: python

代码语言:javascript
复制
    use_unicode = kwargs2.pop('use_unicode', use_unicode)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013-05-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档