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

使用Docker-Compose、Django与MySQL测试时的数据库权限问题

解决Django+Docker-Compose测试时MySQL数据库权限问题

执行python manage.py test时,Django会自动尝试创建名为test_<原数据库名>的测试库,但当前'django'用户无创建数据库的权限,导致出现"Access denied for user 'django'@'%' to database 'test_NAMEDATABASE'"错误。以下是三种可行的解决方法:

方法一:给Django用户添加创建数据库权限

默认情况下,Docker MySQL镜像创建的MYSQL_USER仅拥有指定MYSQL_DATABASE的操作权限,没有创建新数据库的权限。可以通过初始化脚本自动授权:

  1. 项目根目录创建init.sql文件,内容如下:
GRANT CREATE ON *.* TO 'django'@'%';
FLUSH PRIVILEGES;
  1. 修改docker-compose.yml中db服务的volumes配置,挂载初始化脚本:
db:
  image: mysql:latest
  command: --default-authentication-plugin=mysql_native_password
  ports:
    - 3306:${MYSQL_DATABASE_PORT}
  environment:
    - MYSQL_RANDOM_ROOT_PASSWORD
    - MYSQL_USER
    - MYSQL_PASSWORD
    - MYSQL_DATABASE
    - MYSQL_DATABASE_HOST
    - MYSQL_DATABASE_PORT
  volumes:
    - mysql_data:/var/lib/mysql
    - ./init.sql:/docker-entrypoint-initdb.d/init.sql

MySQL容器启动时会自动执行/docker-entrypoint-initdb.d/下的脚本,完成权限配置。

方法二:指定测试数据库名,避免自动创建新库

在Django的settings.py数据库配置中添加TEST字段,直接使用现有数据库作为测试库(Django会创建临时表,测试后自动清理):

'default': {
    'ENGINE': 'django.db.backends.mysql', 
    'NAME': os.environ.get('MYSQL_DATABASE'),
    'USER': os.environ.get('MYSQL_USER'),
    'PASSWORD': os.environ.get('MYSQL_PASSWORD'),
    'HOST': os.environ.get('MYSQL_DATABASE_HOST'),
    'PORT': os.environ.get('MYSQL_DATABASE_PORT'),
    'TEST': {
        'NAME': os.environ.get('MYSQL_DATABASE'),
    }
}

这种方式无需额外创建数据库,也不需要修改用户权限,适合快速解决问题。

方法三:手动创建测试库并授权

如果需要保留独立的测试库,可以手动创建并授权:

  1. 进入MySQL容器:
docker-compose exec db mysql -u root -p
  1. 输入root密码(可通过docker-compose logs db查看日志获取随机生成的root密码),执行以下SQL:
CREATE DATABASE test_<你的原数据库名>;
GRANT ALL PRIVILEGES ON test_<你的原数据库名>.* TO 'django'@'%';
FLUSH PRIVILEGES;

注意:此方法在MySQL数据卷被删除后需要重新执行,适合临时测试场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 09:41:12