programing

장고 시험 앱 오류-:Demand을 담은 데이터베이스를 구축을 부인했다고 오류가 테스트 데이터베이스를 만들었는데요.

copysource 2022. 9. 18. 17:35
반응형

장고 시험 앱 오류-:Demand을 담은 데이터베이스를 구축을 부인했다고 오류가 테스트 데이터베이스를 만들었는데요.

내가 명령(저는 이 명령을 사용하여 myproject 직물을 사용하여 배치하도록 노력했다 알고 보니)에 어떤 앱을 테스트하기 위해:노력한다.

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을 사용하다정정:: ::: ::.py: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_finance. "postgres" 사용자.django사용 권한은 데이터베이스, 이제는 그 오류 메시지를 생성할 수 있지 않습니다.

「 」를 실행하고 migrate ★★★★★★★★★★★★★★★★★」syncdb는 , 을 .finance데이터베이스, 어떤 오류도 하지 않는다.

당신은django 사용자에게 superuser(이 스택 오버 플로에 대한 대답 해트 팁)은 postgres 껍질에 다음과 같은 명령 실행하여createdb 권한을 추가할 수 있다.

=> ALTER USER django CREATEDB;

참고:사용자 이름이에서 사용했다.ALTER USER <username> CREATEDB;명령 당신의 장고 설정 파일에 데이터베이스 사용자와 일치할 필요가 있다.포스터에는 가 이, 본, 본, 용, 용, 용, 용, 용, 용, 용, 용, 용, 용, 용, 용, 용, 용, 용, 용, 용, indjango상기의 회답

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

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

가 Postgres를 가지고 있어야 .createdb★★★★★★ 。

ALTER ROLE miriam CREATEDB;

다음 문서를 참조하십시오.https://docs.djangoproject.com/en/2.0/topics/testing/overview/ #the-test-http://https://docs.djangoproject.com/en/2.0/topics/testing/overview/

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

1. mysite/mysite/settings를 엽니다.화이

데이터베이스 설정에는 projectname_test와 같이 추가 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 워크벤치를 사용하여 다음 명령을 입력하여 설정에서 지정된 사용자에게 모든 권한을 부여합니다.화이

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

, 이제 돼요.python manage.py test polls.

내 경우 GRANT PRIVITEGES 솔루션은 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

와, 그래서 여기 있는 모든 대답과 약간의 수정을 합친 결과 마침내 도커 컴포지트, 장고, 포스트그레를 위한 작동 솔루션에 도달할 수 있었습니다.

먼저 noufal valapra에 의해 지정된 postgres 명령어가 올바르지 않습니다(또는 최신 명령어가 아닐 수도 있습니다).다음과 같아야 합니다.

ALTER USER docker WITH CREATEDB;

도커 컴포지트 설정의 경우, 이것은 init에 들어갑니다.sql 파일, 내 파일은 다음과 같습니다.

CREATE USER docker;
ALTER USER docker WITH CREATEDB;
CREATE DATABASE djangodb;
GRANT ALL PRIVILEGES ON DATABASE djangodb TO docker;

postgres의 Docker file은 다음과 같습니다.

FROM postgres:10.1-alpine
COPY init.sql /docker-entrypoint-initdb.d/

그러면 장고 설정.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'],
        }
    }

도킹 스테이션은 다음과 같습니다.

버전: '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:

사용하시는 경우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"

다음과 같이 입력하여 서버의 postgres 계정으로 전환합니다.

sudo -i -u postgres

이제 다음을 입력하여 Postgres 프롬프트에 즉시 액세스할 수 있습니다.

psql

지금 입력

ALTER USER username CREATEDB;

superuser 계정은 원활한 테스트를 보장하는 가장 쉬운 방법입니다. 따라서 보다 간단한 방법으로djangouser su는 할 예정이다ALTER django WITH SUPERUSER.

자세한 것은, https://www.postgresql.org/docs/current/sql-alteruser.html 를 참조해 주세요.

실행 시 작업을 확인하고 데이터베이스를 전환합니다.

import sys
TESTING = sys.argv[1:2] == ['test']
if TESTING==False:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': config('DB_NAME'),
            'USER': config('DB_USER'),
            'PASSWORD': config('DB_PASSWORD'),
            'HOST': config('DB_HOST'),
            'PORT': ''
             }       
           }
else:
    DATABASES = {    
        'default': {
        "ENGINE": "django.db.backends.sqlite3",
        "TEST": {
            "NAME": os.path.join(BASE_DIR, "test_db.sqlite3"),
        }
    }}

테스트를 일시정지 모드 또는 백그라운드 작업으로 설정했을 수 있습니다.로 시험해 보다fg명령어를 지정합니다.

테스트 데이터베이스를 수동으로 작성할 수도 있지만 TEST 키를 설정에 넣을 수도 있습니다.화이

그런 다음 기본 DB 또는 원하는 DB의 정확한 복제본에서 테스트할 수 있도록 MIRROR 키를 'default' 값으로 채우십시오.

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 문서도 확인할 수 있습니다.

저도 같은 문제에 직면해 있습니다.

테스트

python 테스트 케이스를 실행하는 동안 테스트 데이터베이스를 만들 수 있도록 django 사용자 권한을 변경했습니다.

ALTER USER USERNAME CREATEDB;

오류가 나타내는 것처럼 사용자에게 데이터베이스를 만들 수 있는 충분한 권한이 없습니다.Django는 원래 개발 데이터베이스에 영향을 주지 않도록 테스트 중에 별도의 데이터베이스를 만듭니다.

Postgres 쉘을 통해 권한을 부여해야 할 수도 있습니다.

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 쉘을 시작하고 데이터베이스 작성 권한을 부여합니다.

sudo -u postgres psql


psql (14.5 (Ubuntu 14.5-1.pgdg22.04+1))

postgres=# ALTER ROLE myuser CREATEDB;
Output: ALTER ROLE

언급URL : https://stackoverflow.com/questions/14186055/django-test-app-error-got-an-error-creating-the-test-database-permission-deni

반응형