当我尝试用命令测试任何应用程序时(我注意到当我尝试使用fabric部署我的项目时,它使用了这个命令):
python manage.py test appname
我得到这个错误:
Creating test database for alias 'default'...
Got an error creating the test database: permission denied to create database
Type 'yes' if you would like to try deleting the test database 'test_finance', or 'no' to cancel
Syncdb命令似乎可以工作。我的数据库设置在settings.py:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': 'finance', # Or path to database file if using sqlite3.
'USER': 'django', # Not used with sqlite3.
'PASSWORD': 'mydb123', # Not used with sqlite3.
'HOST': '127.0.0.1', # Set to empty string for localhost. Not used with sqlite3.
'PORT': '', # Set to empty string for default. Not used with sqlite3.
}
}
您也可以手动创建一个测试数据库,但将test键放在settings.py中
然后用值'default'填充传递MIRROR键,这样你就可以测试默认db的精确副本,或者任何你喜欢的db。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'finance',
'USER': 'django',
'TEST': {
'MIRROR': 'default',
},
'PASSWORD': 'mydb123',
'HOST': '127.0.0.1',
'PORT': '',
}
}
你也可以查看django postgres的高级文档
哇,把这里所有的答案结合起来,稍加调整,终于让我得到了一个适用于docker-compose、django和postgres的解决方案……
首先,noufal valapra给出的postgres命令是不正确的(或者可能只是不当前),它应该是:
ALTER USER docker WITH CREATEDB;
在docker-compose设置的情况下,这将进入init。SQL文件,这是我的看起来像:
CREATE USER docker;
ALTER USER docker WITH CREATEDB;
CREATE DATABASE djangodb;
GRANT ALL PRIVILEGES ON DATABASE djangodb TO docker;
然后postgres的Dockerfile是这样的:
FROM postgres:10.1-alpine
COPY init.sql /docker-entrypoint-initdb.d/
然后Django settings.py有这样的条目:
if 'RDS_DB_NAME' in os.environ:
INTERNAL_DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': os.environ['RDS_DB_NAME'],
'USER': os.environ['RDS_USERNAME'],
'PASSWORD': os.environ['RDS_PASSWORD'],
'HOST': os.environ['RDS_HOSTNAME'],
'PORT': os.environ['RDS_PORT'],
}
}
docker-compose看起来是这样的:
版本:“3.6”
服务:
postgresdb:
build:
context: ./
dockerfile: ./Dockerfile-postgresdb
volumes:
- postgresdata:/var/lib/postgresql/data/
django:
build:
context: ../
dockerfile: ./docker/Dockerfile
environment:
- RDS_DB_NAME=djangodb
- RDS_USERNAME=docker
- RDS_PASSWORD=docker
- RDS_HOSTNAME=postgresdb
- RDS_PORT=5432
stdin_open: true
tty: true
depends_on:
- postgresdb
volumes:
postgresdata:
如果数据库是MySQL,那么这两个更改将完成任务。
1.Open mysite mysite / settings.py
您的数据库设置应该有一个额外的“TEST”块,如projectname_test所示。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'myproject',
'USER': 'chandan',
'PASSWORD': 'root',
'HOST': 'localhost',
'PORT': '3306',
'TEST': {
'NAME': 'myproject_test',
},
}
}
2.使用mysql命令提示符或mysql工作台输入下面的命令,将所有权限赋予settings.py中指定的用户
GRANT ALL PRIVILEGES ON myproject_test.* TO 'chandan'@'localhost';
现在你可以运行下面的命令:
python manage.py test polls
我找到了一个有趣的方法来解决你的问题。
事实上,对于MySQL,您可以为不存在的数据库授予特权。
所以你可以在你的设置中为你的测试数据库添加名称'test_finance':
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': 'finance', # Or path to database file if using sqlite3.
'USER': 'django', # Not used with sqlite3.
'PASSWORD': 'mydb123', # Not used with sqlite3.
'HOST': '127.0.0.1', # Set to empty string for localhost. Not used with sqlite3.
'PORT': '', # Set to empty string for default. Not used with sqlite3.
'TEST': {
'NAME': 'test_finance',
},
}
}
以root用户启动MySQL shell:
mysql -u root -p
现在授予这个MySQL中不存在的数据库的所有权限:
GRANT ALL PRIVILEGES ON test_finance.* TO 'django'@'localhost';
现在,Django将毫无问题地启动测试。
如果你正在使用docker-compose,对我来说是这样的:
ALTER ROLE username CREATEDB;
GRANT ALL PRIVILEGES ON test_database_name.* TO 'username';
or
ALTER ROLE username CREATEDB;
GRANT ALL PRIVILEGES ON *.* TO 'username'@'%';
我的设置是这样的:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'database_name',
'USER': 'username',
'PASSWORD': 'password',
'HOST': 'db',
'PORT': '3306',
}
}
还有我的码头作曲。Yml的外观如下:
version: '3'
services:
web:
build: .
command: './wait_for_db_and_start_server.sh'
env_file: env_web
working_dir: /project_name
links:
- db
volumes:
- .:/volume_name
ports:
- "8000:8000"
depends_on:
- db
db:
image: mysql:5.7
restart: always
env_file: env_db
working_dir: /db
volumes:
- ./Dump.sql:/db/Dump.sql
ports:
- "3306:3306"