创建测试数据库时出错-django、docker、mysql



我在创建测试数据库时遇到问题。我使用mysql编写数据库和docker。

使用docker compose运行docker容器没有问题,但当我运行测试时,它会抛出这个错误消息。

请注意,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'...
Got an error creating the test database: (1044, "Access denied for user 'myuser'@'%' to database 'test_mydb'")

我的docker-compose.yml:版本:";3.9〃;

services:
db:
image: mysql:8
env_file:
- .env
command: 
- --default-authentication-plugin=mysql_native_password
restart: always
# ports:
#   - "3306:3306"
# 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 = {
'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',
}
}
}

我看了这个,甚至试过这个。这对我没有帮助。

有谁陷入了类似的问题?

提前感谢各位。

正如K.D Singh所提到的,这确实是mysql用户权限问题。

简而言之,初始化mysql容器时使用root用户

但不确定是什么让用户和测试分开。因为mysql docker hub说

MYSQL_USER,MYSQL_PASSWORD这些变量是可选的,用于创建新用户和设置该用户的密码。该用户将被授予MYSQL_database变量指定的数据库的超级用户权限(见上文(。这两个变量都是创建用户所必需的。

这不意味着如果我创建用户和密码,那么它也有超级用户权限,比如创建数据库吗不确定它为什么有权限问题。

不管怎样,下面是我所改变的

请注意,不需要使用此机制来创建根超级用户,该用户默认使用MYSQL_root_password变量指定的密码创建。

我更改了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'),
}
}

因此,基本上我删除了USER密钥,并用MYSQL_ROOT_PASSWORD更新了PASSWORD,而不是用绑定到MYSQL_USERMYSQL_PASSWORD来启动我的容器。

我的.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:

version: "3.9"
services:
db:
image: mysql:8
env_file:
- .env
command: 
- --default-authentication-plugin=mysql_native_password
restart: always
ports:
- "3308:3306"
# 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:

有趣的是,对于ports部分,请注意我设置了3308:3306。由于我已经有另一个使用默认端口3306运行的mysql容器,所以当我使用端口3306:3306时,它不起作用。所以我只将外部端口更改为3308和内部端口3306。由于django应用程序与内部端口通信,.env文件的端口号保持为3306。

我认为这是一个与django应用程序无关的问题,这看起来像是mysql的基本错误,你试图用没有创建/管理数据库权限的用户创建/访问数据库,请通过数据库的根用户再次测试。

您可以访问此url错误1044(42000(:用户';访问被拒绝'@';localhost';到数据库';db';对于

最新更新