django পরীক্ষা অ্যাপ্লিকেশন ত্রুটি - পরীক্ষা ডাটাবেস তৈরি করতে একটি ত্রুটি পেয়েছে: ডাটাবেস তৈরি করতে অনুমতি অস্বীকার করেছে


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কমান্ড কাজ মনে হচ্ছে। সেটিংসে আমার ডাটাবেস সেটিংস.পি:

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

উত্তর:


370

জাজানো যখন পরীক্ষার স্যুটটি চালায়, এটি আপনার ক্ষেত্রে একটি নতুন ডাটাবেস তৈরি করে test_finance। ইউজারনেম সহ পোস্টগ্রিজ ব্যবহারকারীর djangoডেটাবেস তৈরি করার অনুমতি নেই, সুতরাং ত্রুটি বার্তাটি।

আপনি যখন চালনা করেন migrateবা করেন syncdb, জাঙ্গো financeডাটাবেস তৈরি করার চেষ্টা করে না , যাতে আপনার কোনও ত্রুটি হয় না।

সুপারগ্রাহক হিসাবে পোস্টগ্রিস শেলটিতে নিম্নলিখিত কমান্ডটি চালিয়ে আপনি জ্যাঙ্গো ব্যবহারকারীর মধ্যে ক্রিয়েটব অনুমতি যুক্ত করতে পারেন ( এই স্ট্যাকের ওভারফ্লো উত্তরের টুপি টিপ )।

=> ALTER USER django CREATEDB;

দ্রষ্টব্য:ALTER USER <username> CREATEDB; কমান্ডটিতে ব্যবহৃত ব্যবহারকারীর নামটি আপনার জ্যাঙ্গো সেটিংস ফাইলগুলিতে ডাটাবেস ব্যবহারকারীর সাথে মেলে। এই ক্ষেত্রে, আসল পোস্টারটিতে djangoউপরের উত্তর হিসাবে ব্যবহারকারী ছিল ।


2
যদিও ওপিতে পোস্টগ্র্যাস্কেল ব্যবহার করা হয়েছে, আপনি যদি মাইএসকিএল ব্যবহার করেন তবে আপনার একই ত্রুটি ঘটবে। আপনি এটি মাইএসকিএল-এর সাথে ঠিক করতে পারেন: => সমস্ত দেওয়া * * * জঞ্জো @ লোকালহোস্ট; আমি প্রথমে কেবলমাত্র অনুদান তৈরি করার চেষ্টা করেছিলাম ... তবে তারপরে তৈরি করা ডাটাবেস নির্বাচন বা ড্রপ করতে পারিনি। এটি মূলত আপনার ব্যবহারকারীকে সুপারভাইজার করে তোলে তাই যত্নবান হন।
পয়সাটাইপ

1
আমি কিছুটা পরীক্ষা করে দেখেছি এবং সর্বনিম্ন বিশ্বব্যাপী প্রাইভেলিজগুলি হ'ল ডেটা: নির্বাচন করুন, অন্তর্ভুক্ত করুন, আপডেট করুন, মুছে ফেলুন, কাঠামো: তৈরি করুন, বদল করুন, আইএনডিএক্স, ড্রপ, অ্যাডমিন: রেফারেন্সগুলি। কোনও সুপার-ব্যবহারকারী নয়, তবে এখনও বেশ শক্তিশালী, তাই সাবধানতা অবলম্বন করুন।
স্কট

আমার মামলার জন্য আমি পরীক্ষার ডাটাবেসগুলিতে সমস্ত প্রিভিলিজেসগুলি প্রদান করি, এরকম কিছু:GRANT ALL PRIVILEGES ON test_my_db.* TO 'my_user'@'localhost';
ইয়াসিন রৌজি

16

আমি আপনার সমস্যার আকর্ষণীয় সমাধান পেয়েছি।
আসলে মাইএসকিউএল-এর জন্য আপনি অ-বিদ্যমান ডাটাবেসের জন্য সুযোগ-সুবিধা দিতে পারেন।
সুতরাং আপনি নিজের সেটিংসে আপনার পরীক্ষামূলক ডাটাবেসের জন্য '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 -u root -p

এবং এখন মাইএসকিউএলে থাকা এই অ-বিদ্যমান ডেটাবেসগুলিকে সমস্ত সুযোগ সুবিধা দিন:

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

এখন জাজানো কোনও সমস্যা ছাড়াই পরীক্ষা শুরু করবে।



4

ডাটাবেসটি যদি মাইএসকিএল হয় তবে এই দুটি পরিবর্তনগুলি কাজটি করবে।

1. মাইসাইট / মাইসাইট / সেটিংস.পি খুলুন

আপনার ডাটাবেস সেটিংসে প্রজেক্টনামটিস্টের সাথে দেখানো হিসাবে একটি অতিরিক্ত TEST ব্লক থাকা উচিত ।

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

ব্যবহার করে কমান্ড নিচে 2.Type মাইএসকিউএল কমান্ড প্রম্পটে বা মাইএসকিউএল workbench দিতে নির্দিষ্ট ব্যবহারকারীর সব privilages settings.py

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

এখন আপনি চালাতে পারেন python manage.py test polls


প্রশ্নটি অবশ্যই পোস্টগ্রিসকে ডিবিএমএস হিসাবে ব্যবহার করে। কি হবে projectname_test সঙ্গে সম্পর্কযুক্ত?
কোড-কোবল্ড

@ কোড-কোবল্ড,, হ্যাঁ, তবে আমি একই ত্রুটিটি মাইএসকিএল-তেও দেখতে পাচ্ছি value মান প্রকল্পের_নামটিই প্রজেক্টের নাম উল্লেখ করা হয় আমার উত্তরটি মাইপ্রজেক্ট।
চন্দন

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"

1

আমার ক্ষেত্রে, গ্রান্ট প্রাইভিলিজ সমাধানগুলি পাইথন ৩..2.২ , জ্যাঙ্গো ২.১..7 এবং মাইএসকিউএল ৫..6.২৩ এর সাথে কাজ করে নি ... কেন জানি না।

সুতরাং আমি SQLite কে একটি টেস্ট ডাটাবেস হিসাবে ব্যবহার করার সিদ্ধান্ত নিয়েছি ...

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

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/

তারপরে জ্যাঙ্গো সেটিংস.পি-র এই প্রবেশ রয়েছে:

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

মসৃণ পরীক্ষার গ্যারান্টি দেওয়ার একটি অতি সহজে ব্যবহারকারীর অ্যাকাউন্ট u সুতরাং djangoব্যবহারকারী su তৈরি করার একটি সহজ উপায় হ'ল ALTER django WITH SUPERUSER

আরও তথ্যের জন্য https://www.postgresql.org/docs/current/sql-alteruser.html

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.