2012-04-11 23 views
12

Tôi đang viết bài kiểm tra trong dự án django của mình. Còn bây giờ, tôi có hai kết nối cơ sở dữ liệu:Làm thế nào để biết tên hiện tại của cơ sở dữ liệu ở Django?

(settings.py) 
DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.postgresql_psycopg2', 
     'NAME': 'db_name' 
     ... 
    }, 
} 

và tùy chỉnh kết nối đến MongoDB:

import sys 
from pymongo import Connection 
from pymongo.errors import ConnectionFailure 
try: 
    connection = Connection(host="localhost", port=27017) 
    db = connection['db_name'] 
    print "Connected successfully(Mongo, db_name)" 
except ConnectionFailure, e: 
    sys.stderr.write("Could not connect to MongoDB: %s" % e) 
    sys.exit(1) 

và tôi muốn biết khi nào dự án của tôi đang chạy qua

python manage.py test myapp 

Bởi vì khi bạn chạy thử nghiệm, django tự động tạo DB riêng (với tên như test_db_name), nhưng trong trường hợp này Mongo sẽ vẫn chạy với db_name. Tôi cố gắng:

import sys 
from pymongo import Connection 
from pymongo.errors import ConnectionFailure 
from django.db import connections 

try: 
    connection = Connection(host="localhost", port=27017) 
    db_name = connections['default'].settings_dict['NAME'] 
    db = connection[db_name] 
    print "Connected successfully(Mongo, %s)" % (db_name,) 
except ConnectionFailure, e: 
    sys.stderr.write("Could not connect to MongoDB: %s" % e) 
    sys.exit(1) 

nhưng nó không hoạt động

+0

Bạn đã thử điều này chưa (https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-TEST_NAME) trong cài đặt mongodb trong django? Tôi không bao giờ sử dụng mongodb với django vì vậy tôi không chắc chắn nếu bạn cấu hình nó theo cách như vậy. – Fred

+0

Có, nhưng câu hỏi đặt ra là: làm thế nào tôi có thể xác định tôi nên sử dụng cài đặt nào? các kết nối ['mặc định']. settings_dict chỉ là _dict_ –

+1

Không có định dạng nào có vẻ hoạt động. Xin lỗi điều này là xấu xí. Nhận ở cấp cao nhất và poke xung quanh "./manage.py shell" >>> từ kết nối nhập django.db >>> connections.databases ['default'] {'ENGINE': 'django.db. "." ':' localhost ',' USER ':' xxxx ',' TEST_NAME ': Không,' PASSWORD ':' xxxx ',' PORT ':' '} Có thể một số mục TEST_FOO được điền khi thử nghiệm? –

Trả lời

1

Hãy thử đặt sau đây trong tập tin cài đặt của bạn:

import sys 

management_command = sys.argv[1] if len(sys.argv) > 1 else "" 

TESTING = management_command.startswith("test") 

Nếu TESTING là đúng bạn đang chạy với python kiểm tra manage.py myapp.

chỉnh sửa: Bạn có thể đặt bất kỳ nơi đâu, không nhất thiết là tệp cài đặt của bạn. Cung cấp cho nó một đi và xem nó hoạt động như thế nào!

+0

Nó hoạt động. Nhưng tôi vẫn quan tâm đến giải pháp thanh lịch hơn. –

+0

Tôi rất vui vì nó hoạt động. Bạn muốn một giải pháp thanh lịch hơn theo cách nào? – joshcartme

+0

Tôi nghĩ rằng có một số biến/chức năng ** trong ** django mà từ đó tôi có thể lấy các thiết lập cơ sở dữ liệu hiện tại. –

12

Bạn có thể kiểm tra xem nó trong db.settings:

from django import db 
db.settings.DATABASES['default']['NAME'] 

Để xem các cơ sở dữ liệu sử dụng để lấy một đối tượng cụ thể mà bạn có thể làm:

object._state.db 

này sẽ cung cấp cho bạn chìa khóa cơ sở dữ liệu trong cấu hình, chẳng hạn là 'mặc định', vì vậy nếu bạn có nhiều cơ sở dữ liệu trong cấu hình, bạn có thể kiểm tra đúng.

Khi bạn chạy thử nghiệm, db.settings phải được cập nhật để chứa tên cơ sở dữ liệu thử nghiệm cụ thể.

+9

db không có thuộc tính 'cài đặt' trong django 1.8 – szeitlin

9

Câu trả lời có vẻ là lỗi thời.

Trong django 1.6 bạn có thể làm:

from django import db 
print db.connections.databases 
22

Để có được tên db với các phiên bản Django gần đây (thử với 1.8):

from django.db import connection 
db_name = connection.settings_dict['NAME'] 
# Or alternatively 
# db_name = connection.get_connection_params()['db'] 

Quan tâm của việc đọc giá trị này sau khi khởi tạo, vì vậy rằng nó có giá trị chính xác khi chạy thử nghiệm đơn vị.

+1

Nó được thử nghiệm ok với Django 1.9 cũng –

+0

Nó là ok với Django 1,6 cũng –

1

gì làm việc tuyệt vời đối với tôi (từ điển hoàn toàn trống rỗng trong trường hợp của tôi bởi vì tôi đang sử dụng một tập tin read_default_file trong settings.py) chỉ được thực hiện truy vấn SQL sau

SELECT DATABASE() 
4

Tested trong django 1,9

Đi vào vỏ.

./manage.py shell 

Kiểm tra cơ sở dữ liệu của bạn.

from django import db 
db.connections.databases 
1

Trong Django> = 1.10 phiên bản

Sử dụng:

from django.conf import settings 
db_name = settings.DATABASES['default']['NAME'] 
1

Trong Django> = 1.11

Sử dụng:

from django import db 
db_name = db.utils.settings.DATABASES['default']['NAME'] 
0

Sử dụng truy vấn thô mysql thông qua django, cũng có thể là giải pháp.

from django.db import connection 
cursor = connection.cursor() 
cursor.execute('select database()') 
row = cursor.fetchone() 

print row[0] 
Các vấn đề liên quan