Подтвердить что ты не робот

Как узнать текущее имя базы данных в Django?

Я пишу тесты в своем проекте django. На данный момент у меня есть два подключения к базе данных:

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

и пользовательское подключение к 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)

и я хочу знать, когда мой проект работает через

python manage.py test myapp

Потому что когда вы запускаете тесты, django автоматически создает отдельный DB (с именем вроде test_db_name), но в этом случае Mongo все равно будет работать с db_name. Я пробовал:

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)

но он не работает

4b9b3361

Ответ 1

Попробуйте добавить в свой файл настроек следующее:

import sys

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

TESTING = management_command.startswith("test")

Если TESTING истинно, вы работаете с python manage.py test myapp.

edit: Возможно, вы могли бы разместить это где угодно, не обязательно свой файл настроек. Дайте ему понять, как это работает!

Ответ 2

Чтобы получить имя db с недавними версиями Django (с использованием 1.8):

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

Будьте внимательны при чтении этого значения после инициализации, чтобы он имел правильное значение при выполнении модульных тестов.

Ответ 3

Вы можете проверить его в db.settings:

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

Чтобы просмотреть базу данных, используемую для получения определенного объекта, вы можете сделать:

object._state.db

Это даст вам ключ базы данных в конфигурации, такой как "по умолчанию", поэтому, если у вас есть несколько баз данных в конфигурации, вы можете проверить правильность.

Когда вы запускаете тесты, db.settings следует обновить, чтобы содержать имя базы данных, предназначенное для тестирования.

Ответ 4

Ответ кажется устаревшим.

В django 1.6 вы можете сделать:

from django import db
print db.connections.databases

Ответ 5

IMO, лучший способ сделать это, - это следующая недокументированная функция django:

>>> from django.db import connection
>>> connection.vendor
'postgresql' or 'sqlite'

спасибо to: fooobar.com/questions/276048/...

Ответ 6

Протестировано в django 1.9

Перейдите в оболочку.

./manage.py shell

Проверьте свои базы данных.

from django import db
db.connections.databases

Ответ 7

Что работало отлично для меня (словарь был пуст в моем случае, потому что я использую файл read_default_file в settings.py), просто выполняет следующий SQL-запрос

SELECT DATABASE()

Ответ 8

В Django >= 1.10 версии

Применение:

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

Ответ 9

В Django >= 1.11

Применение:

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

Ответ 10

Использование mysql raw-запроса через django также может быть решением.

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

print row[0]