django test uygulaması hatası - Test veritabanını oluştururken bir hata oluştu: veritabanı oluşturma izni reddedildi


181

Komut ile herhangi bir uygulamayı test etmeye çalıştığımda (bu komutu kullanan fabric kullanarak projemi dağıtmaya çalıştığımda fark ettim):

python manage.py test appname

Bu hatayı alıyorum:

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

syncdbkomut çalışıyor gibi görünüyor. Settings.py içindeki veritabanı ayarlarım:

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

Yanıtlar:


373

Django test paketini çalıştırdığında, sizin durumunuzda yeni bir veritabanı oluşturur test_finance. Kullanıcı adı olan postgres kullanıcısının djangoveritabanı oluşturma izni yoktur, dolayısıyla hata mesajı vardır.

migrateVeya çalıştırdığınızda syncdb, Django financeveritabanını oluşturmaya çalışmaz , bu nedenle hata almazsınız.

Postgres kabuğunda aşağıdaki komutu bir süper kullanıcı olarak çalıştırarak ( bu yığın taşması cevabına şapka ucu) django kullanıcısına createb iznini ekleyebilirsiniz .

=> ALTER USER django CREATEDB;

Not: Komutta kullanılan kullanıcı adının ALTER USER <username> CREATEDB;, Django ayarları dosyalarınızdaki veritabanı kullanıcısıyla eşleşmesi gerekir. Bu durumda, orijinal poster, djangoyukarıdaki cevap olarak kullanıcıya sahipti .


2
OP postgresql kullansa da, mysql kullanıyorsanız aynı hataya sahip olursunuz. Mysql için şu şekilde düzeltebilirsiniz: => GRANT ALL ON *. * TO django @ localhost; Başlangıçta sadece HİBE OLUŞTURULMAYA çalıştım ... ama sonra oluşturulan veritabanını SEÇMEDİ veya DAMLA. Bu aslında kullanıcılarınızı bir süper kullanıcı yapar, bu yüzden dikkatli olun.
mightypile

1
Biraz denedim ve minimum global ayrıcalıkların bulundu: Veri: SELECT, INSERT, UPDATE, DELETE, Yapı: CREATE, ALTER, INDEX, DROP, Yönetici: REFERANSLAR. Süper kullanıcı değil, ama yine de oldukça güçlü, bu yüzden dikkatli olun.
Scott

benim durumum için ben test veritabanı için tüm ayrıcalıkları vermek, böyle bir şey:GRANT ALL PRIVILEGES ON test_my_db.* TO 'my_user'@'localhost';
Yacine Rouizi

17

Sorununa ilginç bir çözüm buldum.
Aslında MySQL için mevcut olmayan veritabanı için ayrıcalık tanıyabilirsiniz.
Böylece, ayar veritabanınıza test veritabanınız için 'test_finance' adını ekleyebilirsiniz:

    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 kabuğunu kök kullanıcı olarak başlat:

mysql -u root -p

ve şimdi MySQL'de mevcut olmayan bu veritabanına tüm ayrıcalıkları verin:

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

Şimdi Django testleri sorunsuz bir şekilde başlatacak.



4

Veritabanı mysql ise bu iki değişiklik işleri halledecektir.

1.Misit / sitem / settings.py'yi açın

Veritabanı ayarlarınızın projectname_test ile gösterildiği gibi ek bir TEST bloğu içermesi gerekir .

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

2. settings.py'de belirtilen kullanıcıya tüm ayrıcalıkları vermek için mysql komut istemini veya mysql çalışma tezgahını kullanarak aşağıdaki komutu yazın.

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

Şimdi koşabilirsiniz python manage.py test polls.


Soru, Postgres'i DBMS olarak kullanıyor. Ne olurdu projectname_test ilişki?
code-kobold

@ code-kobold 7, Evet, ama mysql'de de aynı hatayı görebiliyorum. projectname_test değeri projemin adına bakın. cevabım bu benim projem.
Chandan

2

Benim durumumda, GRANT PRIVILEGES çözümleri Python 3.7.2 , Django 2.1.7 ve MySQL 5.6.23 ile çalışmadı ... Nedenini bilmiyorum.

Bu yüzden SQLite'ı bir TEST veritabanı olarak kullanmaya karar verdim ...

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

Bundan sonra, TESTS arabası sorunsuz çalışıyor:

$ 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-composeBenim için işe yarayanı kullanıyorsanız aşağıdakiler vardı:

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

veya

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

Ayarlarım şöyle:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'database_name',
        'USER': 'username',
        'PASSWORD': 'password',
        'HOST': 'db',
        'PORT': '3306',
    }
}

ve docker-compose.ymlgörünüşüm şöyle:

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

Vay canına buradaki tüm cevapları küçük bir değişiklikle birleştirmek sonunda beni docker-compose, django ve postgres için çalışan bir çözüme götürdü ...

İlk olarak noufal valapra tarafından verilen postgres komutu doğru değil (ya da sadece güncel değil), şöyle olmalıdır:

ALTER USER docker WITH CREATEDB;

Bir docker-compose kurulumu durumunda, bu init.sql dosyasına gider, benimki gibi görünür:

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

Sonra postgres için Dockerfile şöyle görünür:

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

Sonra Django settings.py bu girişe sahiptir:

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 şöyle görünür:

sürüm: '3.6'

Hizmetler:

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

Testinizi askıya alınmış moda veya arka planlı bir iş olarak girebilirsiniz. fgBash kabuğundaki command ile deneyin .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.