创建测试数据库时出现错误 - django,docker,mysql
创建测试数据库时出现错误 - django,docker,mysql
我在创建测试数据库时遇到了问题。我使用mysql作为数据库和docker compose。我在运行docker-compose时没有问题,但是当我运行测试时,它会显示以下错误消息。请注意,django服务的名称是web,mysql服务的名称是db。
$ docker-compose run --rm web sh -c "python manage.py test"
Creating sociallogin_web_run ... done
Creating test database for alias 'default'...
创建测试数据库时出错:(1044, "Access denied for user 'myuser'@'%' to database 'test_mydb'")
我的docker-compose.yml文件如下:
version: "3.9"
services:
db:
image: mysql:8
env_file:
- .env
command:
- --default-authentication-plugin=mysql_native_password
restart: always
volumes:
- data:/var/lib/mysql
web:
build: .
command: >
sh -c "python manage.py wait_for_db &&
python manage.py makemigrations &&
python manage.py migrate &&
python manage.py runserver 0.0.0.0:8000"
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
env_file:
- .env
volumes:
data:
我的.env文件如下:
MYSQL_ROOT_PASSWORD=rootpass
MYSQL_USER=exampleuser
MYSQL_PASSWORD=examplepass
MYSQL_DATABASE=exampledb
MYSQL_PORT=3306
SECRET_KEY=exmaple_random_characters
在settings.py中的DATABASES配置如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': os.environ.get('MYSQL_DATABASE'),
'USER': os.environ.get('MYSQL_USER'),
'PASSWORD': os.environ.get('MYSQL_PASSWORD'),
'PORT': os.environ.get('MYSQL_PORT'),
'HOST': 'db',
'TEST': {
'NAME': 'test_mydb',
}
}
}
我查看了这个链接(https://stackoverflow.com/questions/14186055/django-test-app-error-got-an-error-creating-the-test-database-permission-deni),甚至尝试了这个链接(https://stackoverflow.com/a/45131868/11790764),但都没有帮助。有人遇到过类似的问题吗?提前感谢大家。
在使用django、docker和mysql创建测试数据库时出现了错误。这个问题出现的原因是使用的用户没有创建和管理数据库的权限。解决方法是使用数据库的root用户重新测试。具体的解决方法可以参考这个链接:ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'db'。
出现这个问题的原因是mysql用户权限问题。解决方法是在初始化mysql容器时使用root用户。具体的更改如下:
将Django的DATABASES设置更改为:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': os.environ.get('MYSQL_DATABASE'), 'PASSWORD': os.environ.get('MYSQL_ROOT_PASSWORD'), 'PORT': os.environ.get('MYSQL_PORT'), 'HOST': os.environ.get('MYSQL_HOST'), } }
在.env文件中进行更改:
MYSQL_ROOT_PASSWORD=myrootpassword MYSQL_DATABASE=mydatabasename MYSQL_PORT=3306 MYSQL_HOST=db SECRET_KEY=random_secret_key_that_has_no_dollar_sign
在docker-compose.yml文件中更改端口映射部分:
ports:
- "3308:3306"
需要注意的是,将外部端口改为3308,内部端口仍然保持3306。这是因为已经有一个运行中的mysql容器使用默认端口3306,所以需要将外部端口改为其他端口。而Django应用程序与内部端口进行通信,因此.env文件中的端口号保持为3306。