使用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的操作权限,没有创建新数据库的权限。可以通过初始化脚本自动授权:
- 项目根目录创建
init.sql文件,内容如下:
GRANT CREATE ON *.* TO 'django'@'%'; FLUSH PRIVILEGES;
- 修改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'), } }
这种方式无需额外创建数据库,也不需要修改用户权限,适合快速解决问题。
方法三:手动创建测试库并授权
如果需要保留独立的测试库,可以手动创建并授权:
- 进入MySQL容器:
docker-compose exec db mysql -u root -p
- 输入root密码(可通过
docker-compose logs db查看日志获取随机生成的root密码),执行以下SQL:
CREATE DATABASE test_<你的原数据库名>; GRANT ALL PRIVILEGES ON test_<你的原数据库名>.* TO 'django'@'%'; FLUSH PRIVILEGES;
注意:此方法在MySQL数据卷被删除后需要重新执行,适合临时测试场景。
内容的提问来源于stack exchange,提问作者pietrus
相关产品推荐
相关产品推荐

