当我尝试用命令测试任何应用程序时(我注意到当我尝试使用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.
}
}
哇,把这里所有的答案结合起来,稍加调整,终于让我得到了一个适用于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:
在我的情况下,我不知道为什么GRANT PRIVILEGES解决方案不适用于Python 3.7.2, Django 2.1.7和MySQL 5.6.23。
所以我决定使用SQLite作为TEST数据库:
DATABASES = {
'default': {
'NAME': 'productiondb',
'ENGINE': 'mysql.connector.django', # 'django.db.backends.mysql'
'USER': '<user>',
'PASSWORD': '<pass>',
'HOST': 'localhost',
'PORT': 3306,
'OPTIONS': {
'autocommit': True,
},
'TEST': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
}
}
在此之后,测试可以正常运行:
$ python manage.py test
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
Destroying test database for alias 'default'...
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
Process finished with exit code 0
错误提示用户没有创建数据库的足够权限。Django会在测试期间创建一个单独的数据库,这样我们原来的开发数据库就不会受到影响。
我们可能需要通过Postgres shell给予权限。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': config('DB_NAME'),
'USER': "myuser",
'PASSWORD': config('DB_PASSWORD'),
'HOST': config('DB_HOST'),
'PORT': config('DB_PORT'),
'TEST': {
'NAME': 'test_nofoobar',
},
}
}
正如设置建议的那样,在本例中,数据库用户的名称是myuser。因此,让我们启动Postgres shell并授予数据库创建权限。
sudo -u postgres psql
psql (14.5 (Ubuntu 14.5-1.pgdg22.04+1))
postgres=# ALTER ROLE myuser CREATEDB;
Output: ALTER ROLE