django test app error - परीक्षण डेटाबेस बनाने में त्रुटि हुई: डेटाबेस बनाने के लिए अनुमति से इनकार कर दिया गया


181

जब मैं कमांड के साथ किसी भी एप्लिकेशन का परीक्षण करने की कोशिश करता हूं (मैंने देखा कि जब मैंने कपड़े का उपयोग करके 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कमांड काम करने लगता है। सेटिंग्स में मेरा डेटाबेस सेटिंग्स:

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। उपयोगकर्ता को उपयोक्तानाम के साथ पोस्ट करता हैdjango को डेटाबेस बनाने की अनुमति नहीं है, इसलिए त्रुटि संदेश।

जब आप चलाते हैं migrateया syncdb, Django financeडेटाबेस बनाने की कोशिश नहीं करता है , तो आपको कोई त्रुटि नहीं मिलती है।

आप निम्न कमांड को पोस्टग्रेज शेल में सुपरसुअर ( इस स्टैक ओवरफ्लो उत्तर के लिए हैट) के रूप में चलाकर django उपयोगकर्ता में जोड़ सकते हैं ।

=> ALTER USER django CREATEDB;

नोट:ALTER USER <username> CREATEDB; कमांड में उपयोग किए जाने वाले उपयोगकर्ता नाम को आपकी Django सेटिंग्स फ़ाइलों में डेटाबेस उपयोगकर्ता से मेल खाना चाहिए। इस मामले में, मूल पोस्टर, djangoउपर्युक्त उत्तर के रूप में उपयोगकर्ता के पास था ।


2
हालांकि ओपी ने पोस्टग्रैस्क्ल का इस्तेमाल किया है, अगर आप mysql का उपयोग कर रहे हैं तो आपके पास एक ही त्रुटि होगी। आप इसे mysql के लिए ठीक कर सकते हैं: => सभी को प्राप्त करें। * django @ localhost को; मैंने मूल रूप से केवल GRATE CREATE करने की कोशिश की ... लेकिन फिर बनाए गए डेटाबेस को Select या DROP नहीं कर सका। यह अनिवार्य रूप से आपके उपयोगकर्ता को सुपरयुसर बनाता है, इसलिए सावधान रहें।
mightypile

1
मैंने थोड़ा प्रयोग किया और पाया कि न्यूनतम वैश्विक निजीकृत हैं - डेटा: SELECT, INSERT, UPDATE, DELETE, संरचना: CREATE, ALTER, INDEX, DROP, व्यवस्थापक: संदर्भ। एक सुपर-उपयोगकर्ता नहीं है, लेकिन अभी भी बहुत शक्तिशाली है, इसलिए सावधानी बरतें।
स्कॉट

मेरे मामले के लिए मैं सभी GRANT ALL PRIVILEGES ON test_my_db.* TO 'my_user'@'localhost';
प्राइवेटलीजेस को टे

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';

अब Django बिना किसी समस्या के परीक्षण शुरू करेगा।



4

अगर डेटाबेस mysql है तो इन दो बदलावों से चीजें हो जाएंगी।

1.Open mysite / mysite / settings.py

आपकी डेटाबेस सेटिंग्स में एक अतिरिक्त टेस्ट ब्लॉक होना चाहिए जैसा कि प्रोजेक्टनेम_टेस्ट के साथ दिखाया गया है ।

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


प्रश्न स्पष्ट रूप से Postgres को DBMS के रूप में उपयोग करता है। क्या होगा projectname_test से संबंधित हैं?
कोड-कोबॉल्ड

@ कोड-कोबॉल्ड 7, हां, लेकिन मैं mysql में भी वही त्रुटि देख सकता हूं। मूल्य projectname_test प्रोजेक्ट ex.in के नाम से संबंधित है। मेरा उत्तर यह myproject है।
चंदन

2

मेरे मामले में, GRIV PRIVILEGES समाधान पायथन 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'),
        },
    }
}

उसके बाद, 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

वाह, तो यहाँ सभी जवाबों को एक छोटे से ट्विकिंग के साथ मिलाकर आखिरकार मुझे डॉकटर-कम्पोज़, डेंजो के लिए काम करने वाले समाधान के लिए मिला, और पोस्टग्रेज ...

पहले नौफाल वालपरा द्वारा दी गई पोस्टग्रेज कमांड सही नहीं है (या शायद अभी चालू नहीं है), यह होना चाहिए:

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;

तब डाकियों के लिए डॉकफाइल ऐसा दिखता है:

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

और डॉकटर-कम्पोज़ इस तरह दिखता है:

संस्करण: '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

हो सकता है कि आप अपना परीक्षण स्थगित मोड में या एक पृष्ठभूमि वाली नौकरी के रूप में करें। fgबैश शेल में कमांड के साथ प्रयास करें ।


0

सुचारू परीक्षण की गारंटी के लिए एक सुपरसुअर खाता सबसे आसान तरीका है। तो djangoउपयोगकर्ता सु बनाने का एक सरल तरीका है ALTER django WITH SUPERUSER

अधिक जानकारी के लिए https://www.postgresql.org/docs/current/sql-alteruser.html

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.