Странная ошибка: 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. Так в чем же проблема?

Вернуться на верх