web-dev-qa-db-fra.com

Comment connaître le nom actuel de la base de données dans Django?

J'écris des tests dans mon projet Django. Pour l'instant, j'ai deux connexions de base de données:

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

et connexion personnalisée à 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)

et je veux savoir quand mon projet se poursuit

python manage.py test myapp

Parce que lorsque vous exécutez des tests, Django crée automatiquement une base de données distincte (portant le nom test_db_name ), mais dans ce cas, Mongo fonctionnera toujours avec db_name . J'ai essayé:

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)

mais ça ne marche pas

24
Artem Mezhenin

Pour obtenir le nom de la base de données avec les versions récentes de Django (essayé avec la version 1.8):

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

Pensez à lire cette valeur après l’initialisation afin qu’elle ait la valeur correcte lors de l’exécution de tests unitaires.

37
Rems

Vous pouvez le vérifier dans db.settings:

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

Pour voir la base de données utilisée pour récupérer un objet spécifique, vous pouvez faire:

object._state.db

Cela vous donnera la clé de la base de données dans la configuration, telle que «par défaut». Ainsi, si vous avez plusieurs bases de données dans la configuration, vous pouvez vérifier la bonne.

Lorsque vous exécutez des tests, db.settings doit être mis à jour pour contenir le nom de la base de données spécifique au test.

12
naktinis

La réponse semble être obsolète.

Dans Django 1.6, vous pouvez faire: 

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

Testé dans Django 1.9

Allez dans la coquille. 

./manage.py Shell

Vérifiez vos bases de données. 

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

La meilleure façon de procéder consiste à utiliser la fonction non documentée Django suivante:

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

Merci à: https://stackoverflow.com/a/18849255/1237092

5
user1237092

Essayez de mettre les éléments suivants dans votre fichier de paramètres:

import sys

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

TESTING = management_command.startswith("test")

Si TESTING est défini sur true, vous exécutez avec python manage.py test myapp. 

edit: Vous pouvez probablement mettre cela n'importe où, pas nécessairement votre fichier de paramètres. Essayez-le et voyez comment cela fonctionne!

2
joshcartme

Dans Django> = version 1.10 

Utilisation:

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

Ce qui a parfaitement fonctionné pour moi (le dictionnaire était vide dans mon cas parce que j'utilise un fichier read_default_file dans settings.py) est en train d'exécuter la requête SQL suivante

SELECT DATABASE()
1
g3rv4

Dans Django> = 1.11

Utilisation:

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

Utiliser mysql raw query via Django peut également constituer une solution.

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

print row[0]
0
SuperNova