Странная ошибка: django.db.utils.OperationalError: (2000, 'Unknown MySQL error')
Похожий вопрос, но более странный: Что такое django.db.utils.OperationalError: (2000, 'Unknown MySQL error')
У меня есть приложение, использующее Django3.2 и прекрасно работающее в контейнере (ubuntu 18.04), вчера я попытался запустить его в другом контейнере на основе образа python:3.9.13-bullseye
из docker hub, оно прекрасно работает на моем macbook и ноутбуке Windows, НО когда я запускаю приложение в контейнере на основе того же образа в нашем тестовом окружении, exec python manage.py runserver
, оно сообщает
Traceback (most recent call last):
File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 85, in _execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python3.9/site-packages/django/db/backends/mysql/base.py", line 73, in execute
return self.cursor.execute(query, args)
File "/usr/local/lib/python3.9/site-packages/MySQLdb/cursors.py", line 206, in execute
res = self._query(query)
File "/usr/local/lib/python3.9/site-packages/MySQLdb/cursors.py", line 319, in _query
db.query(q)
File "/usr/local/lib/python3.9/site-packages/MySQLdb/connections.py", line 254, in query
_mysql.connection.query(self, query)
MySQLdb._exceptions.OperationalError: (2000, 'Unknown MySQL error')
Настройки DATABASES в Django:
DATABASES["default"] = {
"ENGINE": "django.db.backends.mysql",
"NAME": "diag",
"USER": DATABASE_USER,
"PASSWORD": DATABASE_PASSWORD,
"HOST": DATABASE_HOST,
"PORT": DATABASE_PORT,
"OPTIONS": {
"connect_timeout": 5,
"charset": "utf8mb4",
},
}
Различия между моим macbook и нашей тестовой средой: macbook:
host: macOS 12.5.1
Docker version 20.10.16, build aa7e414
test env:
host: ubuntu 16.04
Docker version 19.03.14, build 5eb3275d40
Странные вещи продолжаются.
Внутри контейнера test env я запустил python manage.py shell
Python 3.9.13 (main, Aug 23 2022, 09:07:44)
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.contrib.auth.models import *
>>> Permission.objects.first()
<Permission: auth | Group | Can add group>
Выполнить SQL запрос OK, затем я изменил charset опции DATABASES с utf8mb4
на utf8
, затем выполнил python manage.py runserver
:
Django version 3.2.11, using settings 'diagnosis.settings.instance'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Это тоже нормально, но utf8mb4
для нас необходим.
Затем я продолжаю тестировать в оболочке Django:
>>> import MySQLdb
>>> conn=MySQLdb.connect("172.17.0.1",user="user",passwd="passwd",charset="utf8mb4")
>>> cursor=conn.cursor()
>>> cursor.execute('select "😄";')
1
>>> cursor.fetchall()
(('😄',),)
хаха. Подводя итог:
В тестовой среде:
# `manage.py runserver`OK
DATABASES["default"] = {
"ENGINE": "django.db.backends.mysql",
"NAME": "diag",
"USER": DATABASE_USER,
"PASSWORD": DATABASE_PASSWORD,
"HOST": DATABASE_HOST,
"PORT": DATABASE_PORT,
"OPTIONS": {
"connect_timeout": 5,
"charset": "utf8",
},
}
# `manage.py runserver` NOT OK, but exec SQL in shell OK.
DATABASES["default"] = {
"ENGINE": "django.db.backends.mysql",
"NAME": "diag",
"USER": DATABASE_USER,
"PASSWORD": DATABASE_PASSWORD,
"HOST": DATABASE_HOST,
"PORT": DATABASE_PORT,
"OPTIONS": {
"connect_timeout": 5,
"charset": "utf8mb4",
},
}
# `manage.py runserver`OK
DATABASES["default"] = {
"ENGINE": "django.db.backends.mysql",
"NAME": "diag",
"USER": DATABASE_USER,
"PASSWORD": DATABASE_PASSWORD,
"HOST": DATABASE_HOST,
"PORT": DATABASE_PORT,
"OPTIONS": {
"connect_timeout": 5,
"charset": "utf8mb4",
"init_command": "SET sql_mode='STRICT_TRANS_TABLES'"
},
}
Все эти три программы отлично работают на моем macbook. Так в чем же проблема?