You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署Django+MySQL遇only_full_group_by报错,修改SQL_MODE无效求助

解决Docker部署MySQL 8时的only_full_group_by报错问题

问题根源

你通过SET GLOBAL sql_mode做的修改是临时的——容器重启后,MySQL会加载镜像默认的配置,之前的修改会完全丢失。另外MySQL 8的Docker镜像里没有service命令,没法用它重启服务。

两种永久解决办法

办法1:挂载自定义配置文件

  1. 在本地项目目录下新建my.cnf文件,写入以下内容:
[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

(这是MySQL默认sql_mode去掉ONLY_FULL_GROUP_BY后的配置,你可以按需调整)

  1. 修改你的docker-compose.yml,给db_mysql服务添加配置文件挂载:
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
      - ./my.cnf:/etc/mysql/conf.d/my.cnf  # 挂载自定义配置到容器内
  1. 重启容器生效:
docker-compose down && docker-compose up -d

办法2:通过环境变量直接设置

直接在docker-compose.yml的环境变量里指定sql_mode,省去配置文件:

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
      # 设置初始化时的sql_mode
      MYSQL_INITDB_SQL_MODE: STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    ports:
      - '3306:3306'
    expose:
      - '3306'
    volumes:
      - dbdata:/var/lib/mysql

同样执行docker-compose down && docker-compose up -d重启容器。

验证修改

进入容器登录MySQL后执行:

SELECT @@sql_mode;

确认输出里没有ONLY_FULL_GROUP_BY就说明配置生效了。

内容的提问来源于stack exchange,提问作者Alonso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 04:40:29