2013-01-06 37 views
104

Khi tôi thử kiểm tra bất kỳ ứng dụng nào bằng lệnh (tôi nhận thấy nó khi tôi cố gắng triển khai myproject bằng vải, sử dụng lệnh này):lỗi ứng dụng thử django - Đã xảy ra lỗi khi tạo cơ sở dữ liệu thử nghiệm: được phép từ chối tạo cơ sở dữ liệu

python manage.py test appname 

tôi nhận được lỗi này:

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 lệnh dường như làm việc. Cài đặt cơ sở dữ liệu của tôi trong 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. 
    } 
} 

Trả lời

236

Khi Django chạy bộ kiểm tra, nó tạo cơ sở dữ liệu mới, trong trường hợp test_finance của bạn. Người dùng postgres có tên người dùng django không được phép tạo cơ sở dữ liệu, do đó có thông báo lỗi.

Khi bạn chạy syncdb, Django không cố gắng tạo cơ sở dữ liệu tài chính, do đó bạn không gặp bất kỳ lỗi nào.

Bạn có thể thêm quyền được tạob cho người dùng django bằng cách chạy lệnh sau trong vỏ đăng xuất dưới dạng siêu người dùng (mũ tip đến this stack overflow answer).

=> ALTER USER django CREATEDB; 

Lưu ý: Tên người dùng sử dụng trong ALTER USER <username> CREATEDB; nhu cầu lệnh để phù hợp với người sử dụng cơ sở dữ liệu trong Django của bạn cài đặt tập tin. Trong trường hợp này, áp phích gốc, có người dùng là django câu trả lời ở trên.

+1

Xin lỗi tôi không thể kiểm tra nó trước đó. Cảm ơn nó đã làm việc. – Andrius

+1

Mặc dù OP sử dụng postgresql, nếu bạn đang sử dụng mysql, bạn sẽ có lỗi tương tự. Bạn có thể sửa chữa nó cho mysql với: => GRANT ALL ON \ *. \ * ĐẾN django @ localhost; Ban đầu tôi đã cố gắng chỉ GRANT CREATE ... nhưng sau đó không thể SELECT hoặc DROP cơ sở dữ liệu được tạo ra. Điều này chủ yếu làm cho người dùng của bạn trở thành siêu người dùng, vì vậy hãy cẩn thận. – mightypile

+1

Tôi đã thử nghiệm một chút và tìm thấy các đặc quyền tối thiểu toàn cầu là - Dữ liệu: SELECT, INSERT, UPDATE, DELETE, Cấu trúc: TẠO, ALTER, INDEX, DROP, Admin: TÀI LIỆU THAM KHẢO. Không phải là siêu người dùng, nhưng vẫn khá mạnh mẽ, vì vậy hãy thận trọng khi sử dụng. – Scott

6

Tôi đã tìm thấy giải pháp thú vị cho vấn đề của bạn.
Thực tế đối với MySQL, bạn có thể cấp đặc quyền cho cơ sở dữ liệu không tồn tại.
Vì vậy, bạn có thể thêm tên 'test_finance' cho cơ sở dữ liệu thử nghiệm của bạn trong cài đặt của bạn:

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

đầu vỏ MySQL như là người dùng root:

mysql -u root -p 

và bây giờ cấp tất cả các đặc quyền này không tồn tại cơ sở dữ liệu trong MySQL:

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

Bây giờ Django sẽ bắt đầu kiểm tra mà không gặp bất kỳ sự cố nào.

1

Nếu cơ sở dữ liệu là mysql thì hai thay đổi này sẽ hoàn thành công việc.

1.Open mysite/mysite/settings.py

thiết lập cơ sở dữ liệu của bạn nên có một khối kiểm tra bổ sung như hình với projectname_test.

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

2.Type lệnh dưới đây sử dụng mysql command prompt hoặc mysql workbench để cung cấp cho tất cả privilages cho người sử dụng quy định tại cài đặt.py

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

Bây giờ bạn có thể chạy python manage.py test polls.

+0

Câu hỏi rõ ràng là sử dụng Postgres như DBMS. * Projectname_test * sẽ liên quan đến điều gì? –

+0

@ code-kobold 7, Có, nhưng tôi có thể thấy cùng một lỗi trong mysql như well.The value projectname_test là tham chiếu đến tên của dự án ex.in câu trả lời của tôi nó là myproject. – Chandan

Các vấn đề liên quan