django test app error-테스트 데이터베이스 작성 중 오류 발생 : 데이터베이스 작성 권한이 거부되었습니다.


181

명령을 사용하여 앱을 테스트하려고 할 때 (이 명령을 사용하는 패브릭을 사용하여 프로젝트를 배포하려고 시도했을 때 나타났습니다).

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.
    }
}

답변:


373

Django는 테스트 스위트를 실행할 때 새 데이터베이스를 작성합니다 test_finance. username을 가진 postgres 사용자 django에게는 데이터베이스 생성 권한이 없으므로 오류 메시지가 표시됩니다.

당신이 실행하는 경우 migrate또는 syncdb, 장고는 만들려고하지 않습니다 finance당신이 오류를 할 수없는 상황이 발생하지 않도록 데이터베이스를.

postgres 쉘에서 다음 명령을 수퍼 유저로 실행하여 django 사용자에게 createdb 권한을 추가 할 수 있습니다 ( 이 스택 오버플로 응답의 팁 ).

=> ALTER USER django CREATEDB;

참고 :ALTER USER <username> CREATEDB; 명령에 사용 된 사용자 이름 은 Django 설정 파일의 데이터베이스 사용자와 일치해야합니다. 이 경우, 원래 포스터 django는 위의 답변으로 사용자를 가졌습니다 .


2
OP가 postgresql을 사용했지만 mysql을 사용하는 경우 동일한 오류가 발생합니다. mysql에 대해 다음을 사용하여 수정할 수 있습니다. => GRANT ALL ON *. * TO django @ localhost; 원래 GRANT CREATE 만 시도했지만 작성된 데이터베이스를 SELECT 또는 DROP 할 수 없었습니다. 이것은 본질적으로 사용자를 수퍼 유저로 만들므로주의하십시오.
mightypile

1
나는 약간의 실험을하고 최소 글로벌 권한이 데이터 : SELECT, INSERT, UPDATE, DELETE, 구조 : CREATE, ALTER, INDEX, DROP, Admin : REFERENCES임을 알았습니다. 수퍼 유저는 아니지만 여전히 강력하기 때문에주의하십시오.
Scott

내 경우에는 모든 권한을 테스트 데이터베이스에 다음과 같이 부여합니다.GRANT ALL PRIVILEGES ON test_my_db.* TO 'my_user'@'localhost';
Yacine Rouizi

17

귀하의 문제에 대한 흥미로운 해결책을 찾았습니다.
실제로 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',
        },
    }
}

루트 사용자로 MySQL 쉘을 시작하십시오.

mysql -u root -p

이제 MySQL의 존재하지 않는 데이터베이스에 대한 모든 권한을 부여하십시오.

GRANT ALL PRIVILEGES ON test_finance.* TO 'django'@'localhost';

이제 장고는 아무런 문제없이 테스트를 시작할 것입니다.



4

데이터베이스가 mysql 이면이 두 가지 변경으로 작업이 완료됩니다.

1. mysite / mysite / settings.py를 엽니 다

projectname_test 와 같이 데이터베이스 설정에 추가 테스트 블록이 있어야합니다 .

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'myproject',
        'USER': 'chandan',
        'PASSWORD': 'root',
        'HOST': 'localhost',
        'PORT': '3306',
        'TEST': {
            'NAME': 'myproject_test',
        },
    }
}

mysql 명령 프롬프트 또는 mysql workbench 를 사용하여 아래 명령을 입력하여 settings에 지정된 사용자에게 모든 권한을 부여하십시오.

GRANT ALL PRIVILEGES ON myproject_test.* TO 'chandan'@'localhost';

이제 당신은 실행할 수 있습니다 python manage.py test polls.


이 질문은 분명히 Postgres를 DBMS로 사용합니다. projectname_test 는 무엇 과 관련이 있습니까?
code-kobold

@ code-kobold 7, 예, mysql에서도 동일한 오류를 볼 수 있습니다. 값 projectname_test는 프로젝트의 이름을 나타냅니다.
Chandan

2

필자의 경우 GRANT PRIVILEGES 솔루션은 Python 3.7.2 , Django 2.1.7MySQL 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'),
        },
    }
}

그 후 TESTS 자동차는 문제없이 운전합니다.

$ 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

1

docker-compose나를 위해 일한 것을 사용 하는 경우 다음과 같습니다.

ALTER ROLE username CREATEDB;
GRANT ALL PRIVILEGES ON test_database_name.* TO 'username';

또는

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',
    }
}

docker-compose.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"

0

와우 여기에 모든 대답을 약간 조정하여 마침내 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:

0

테스트를 일시 중단 모드 또는 백그라운드 작업으로 설정했을 수 있습니다. fgbash shell에서 명령을 사용해보십시오 .


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.