it-roy-ru.com

Как узнать текущее имя базы данных в 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 автоматически создает отдельную БД (с именем вроде 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)

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

24
Artem Mezhenin

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

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

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

37
Rems

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

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

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

object._state.db

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

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

12
naktinis

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

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

from Django import db
print db.connections.databases
10
Jan DB

Проверено в Django 1.9

Войдите в Shell. 

./manage.py Shell

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

from Django import db
db.connections.databases
6
Jeff Gu Kang

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

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

Спасибо: https://stackoverflow.com/a/18849255/1237092

5
user1237092

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

import sys

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

TESTING = management_command.startswith("test")

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

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

2
joshcartme

В версии Django> = 1.10 

Использование:

from Django.conf import settings
db_name = settings.DATABASES['default']['NAME']
2
Mohammed Yasin

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

SELECT DATABASE()
1
g3rv4

В Джанго> = 1.11

Использование:

from Django import db
db_name = db.utils.settings.DATABASES['default']['NAME']
1
Juliano Barbosa

Использование MySQL необработанных запросов через Django, также может быть решением.

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

print row[0]
0
SuperNova