У меня проблема с MySQL и Django на Docker: "sql_mode=only_full_group_by".

"Выражение #3 из списка SELECT не находится в предложении GROUP BY и содержит неагрегированный столбец 'database_name.i.id', который не является функционально зависит от столбцов в предложении GROUP BY; это несовместимо с sql_mode=only_full_group_by"

Здравствуйте, извините за мой английский. У меня проблема с MySQL и Django, когда я докеризирую свой проект. Я новичок в этих технологиях. Вот часть моего файла docker-compose:

db_mysql:
    image: mysql:8
    container_name: db_mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: database_name
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    ports:
      - '3306:3306'
    expose:
      - '3306'
    volumes:
      - dbdata:/var/lib/mysql

Проблема возникает, когда я развертываю свой проект и вхожу в секцию. Появляется сообщение, которое я показывал изначально.

Я попытался применить то, что указано в этом сообщении, но проблема сохраняется. Список SELECT не находится в предложении GROUP BY и содержит неагрегированный столбец .... несовместим с sql_mode=only_full_group_by

Я сделал следующее: Я ввел контейнер моей базы данных:

docker exec -it db_mysql bash

Я вошел в MySQL под пользователем root:

mysql -u root -p

Я разместил команду для изменения значения SQL_MODE:

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

Я проверил, что изменение было сделано:

SELECT @@sql_mode;

Я вышел из контейнера и снова запустил его с:

docker restart db_mysql

Когда я возвращаюсь к проекту, проблема сохраняется.

В сообщении говорится, что я должен перезапустить MySQL, чтобы изменения были сохранены. Но когда я пытаюсь запустить restart из контейнера, он говорит мне, что команда service не существует:

service mysqld restart

Вы прочитали неправильный совет. Перезапуск службы mysqld сбрасывает все изменения, которые вы внесли с помощью SET GLOBAL. Конфигурация возвращается к значениям по умолчанию.

Если вы хотите установить глобальные переменные автоматически при запуске контейнера docker, вы можете сделать одно из следующих действий:

  • Передайте параметры в качестве аргументов в команду для контейнера
  • Задайте параметры в конфигурационном файле и ссылайтесь на этот файл в своем контейнере

Читайте https://ahelpme.com/software/docker/edit-mysql-options-in-docker-or-docker-compose-mysql/ для руководства по выполнению обоих этих методов.

Поэтому я согласен с комментарием выше, что не следует отключать ONLY_FULL_GROUP_BY. Это важно для предотвращения некорректных запросов.

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