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
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.
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.
La réponse semble être obsolète.
Dans Django 1.6, vous pouvez faire:
from Django import db
print db.connections.databases
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
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'
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!
Dans Django> = version 1.10
Utilisation:
from Django.conf import settings
db_name = settings.DATABASES['default']['NAME']
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()
Dans Django> = 1.11
Utilisation:
from Django import db
db_name = db.utils.settings.DATABASES['default']['NAME']
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]