У меня проблема с 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. Это важно для предотвращения некорректных запросов.