1

我们遇到的问题是:我们已经成功运行了 manage.py makemigrations 和 manage.py migrate,之后我们开始收到以下错误:

 File "/usr/local/goibibo/python/lib/python3.5/site-packages/django/db/backends/mysql/base.py", line 110, in execute
    return self.cursor.execute(query, args)
  File "/usr/local/goibibo/python/lib/python3.5/site-packages/MySQLdb/cursors.py", line 250, in execute
    self.errorhandler(self, exc, value)
  File "/usr/local/goibibo/python/lib/python3.5/site-packages/MySQLdb/connections.py", line 50, in defaulterrorhandler
    raise errorvalue
  File "/usr/local/goibibo/python/lib/python3.5/site-packages/MySQLdb/cursors.py", line 247, in execute
    res = self._query(query)
  File "/usr/local/goibibo/python/lib/python3.5/site-packages/MySQLdb/cursors.py", line 411, in _query
    rowcount = self._do_query(q)
  File "/usr/local/goibibo/python/lib/python3.5/site-packages/MySQLdb/cursors.py", line 374, in _do_query
    db.query(q)
  File "/usr/local/goibibo/python/lib/python3.5/site-packages/MySQLdb/connections.py", line 292, in query
    _mysql.connection.query(self, query)
django.db.utils.OperationalError: (2027, 'Malformed packet')

并不是每次我们运行 makemigrations 时都会出现这个问题。
它是随机出现的,但一旦出现它就会粘住,我们不知道为什么会发生这种情况。有人可以帮助我们解决这个问题并解释为什么会发生这种情况。

应用程序中使用的包:

adium-theme-ubuntu==0.3.4
appdirs==1.4.3
asn1crypto==0.22.0
backports-abc==0.5
blinker==1.4
boto3==1.4.4
botocore==1.5.35
certifi==2017.4.17
cffi==1.10.0
chardet==2.3.0
click==6.7
ConcurrentLogHandler==0.9.1
configobj==5.0.6
decorator==4.0.11
Django==1.10.4
djangorestframework==3.5.3
docutils==0.13.1
Flask==0.11.1
futures==3.1.1
gevent==1.2a1
greenlet==0.4.10
gyp==0.1
idna==2.5
itsdangerous==0.24
Jinja2==2.8
jmespath==0.9.2
jsonpatch==1.10
jsonpath==0.75
jsonpath-rw==1.4.0
jsonpointer==1.10
MarkupSafe==1.0
newrelic==2.82.0.62
oauthlib==1.0.3
packaging==16.8
Pillow==3.1.2
ply==3.10
prettytable==0.7.2
pyasn1==0.1.9
pycparser==2.17
pycurl==7.43.0
PyJWT==1.3.0
PyMySQL==0.7.9
PyOpenGL==3.0.2
pyparsing==2.2.0
Pyrex==0.9.8.5
pyserial==3.0.1
PySocks==1.6.5
python-dateutil==2.6.0
PyYAML==3.11
requests==2.14.2
s3transfer==0.1.10
singledispatch==3.4.0.3
six==1.10.0
SQLAlchemy==1.1.4
ssh-import-id==5.5
tornado==4.4.2
unity-lens-photos==1.0
urllib3==1.19.1
virtualenv==15.1.0
Werkzeug==0.12.1
4

2 回答 2

0

同样的问题困扰了我的团队一段时间,并且在网络上几乎没有关于它的有用信息。我们花了很多时间解决这个问题 - 最终找到了解决它的解决方案(至少 - 对于我们的团队来说)!

我们发现 Django 默认将数据库连接的“charset”选项设置为“utf8”。在故障排除期间,我们使用了两个独立的数据库连接对象:一个由 Django 为我们创建,另一个 - 使用直接 _mysql.connect() 命令手动创建。当我们使用两个连接对象执行完全相同的查询时——由 Django 创建的那个导致“ django.db.utils.OperationalError: (2027, 'Malformed packet')“(这正是我们在 API 中得到的),但是第二个连接(手动)- 没有任何问题。进一步比较两个连接对象(我们实际上必须使用 Python 调试器“pdb”并在 django 中设置断点.db.backends.mysql.base.py ) - 显示 Django 通过传递“charset”:“utf8”创建连接,而手动 _mysql 连接 - 使用“latin1”。一旦我们添加“charset”:“latin1 " 到我们的 settings.py 中的 DATABASES["default"]["OPTIONS"] - 这个错误消失了。

总而言之,解决方案(对我们来说)是在 DATABASES 配置的“OPTIONS”配置部分中显式设置“charset”:“latin1” - 对于每个数据库别名。我不能肯定地说这对遇到此错误的每个人都有效 - 但它肯定对我们有效。

于 2021-03-12T00:14:33.037 回答
0

在 mysql 5.6.17 中通过 SET read_rnd_buffer_size=256000 为会话解决。不必更改 my.ini (cfg)。

于 2017-08-22T11:40:54.793 回答