webentwicklung-frage-antwort-db.com.de

Wie kann man den aktuellen Namen der Datenbank in Django erfahren?

Ich schreibe Tests in meinem Django-Projekt. Im Moment habe ich zwei Datenbankverbindungen:

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

und benutzerdefinierte Verbindung zu 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)

und ich möchte wissen, wann mein Projekt durchläuft

python manage.py test myapp

Denn wenn Sie Tests ausführen, erstellt Django automatisch eine separate Datenbank (mit einem Namen wie test_db_name ). In diesem Fall wird Mongo jedoch weiterhin mit db_name ausgeführt. Ich habe es versucht:

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)

aber es funktioniert nicht

24
Artem Mezhenin

So ermitteln Sie den Datenbanknamen mit den letzten Django-Versionen (versucht mit 1.8):

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

Denken Sie daran, diesen Wert nach der Initialisierung zu lesen, damit er beim Ausführen von Komponententests den richtigen Wert hat.

37
Rems

Sie können es in db.settings überprüfen:

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

Um die Datenbank anzuzeigen, die zum Abrufen eines bestimmten Objekts verwendet wird, können Sie Folgendes tun:

object._state.db

Dadurch erhalten Sie den Datenbankschlüssel in "config", beispielsweise "default". Wenn Sie in config mehrere Datenbanken haben, können Sie die richtige Datenbank überprüfen.

Wenn Sie Tests ausführen, sollte db.settings mit dem testspezifischen Datenbanknamen aktualisiert werden.

12
naktinis

Die Antwort scheint veraltet zu sein.

In Django 1.6 können Sie Folgendes tun: 

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

Getestet in Django 1.9

Geh in die Schale. 

./manage.py Shell

Überprüfen Sie Ihre Datenbanken. 

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

IMO, der beste Weg, dies zu tun, ist die folgende undokumentierte Django-Funktion:

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

Danke an: https://stackoverflow.com/a/18849255/1237092

5
user1237092

Versuchen Sie, Folgendes in Ihre Einstellungsdatei aufzunehmen:

import sys

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

TESTING = management_command.startswith("test")

Wenn TESTING wahr ist, laufen Sie mit python manage.py test myapp. 

edit: Sie könnten das wahrscheinlich überall ablegen, nicht unbedingt Ihre Einstellungsdatei. Probieren Sie es aus und sehen Sie, wie es funktioniert!

2
joshcartme

In Django> = 1.10 Version 

Benutzen:

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

Was für mich hervorragend funktioniert hat (das Wörterbuch war in meinem Fall leer, weil ich eine read_default_file-Datei in settings.py verwende), führt nur die folgende SQL-Abfrage aus

SELECT DATABASE()
1
g3rv4

In Django> = 1,11

Benutzen:

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

Die Verwendung von mysql raw query über Django kann auch eine Lösung sein.

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

print row[0]
0
SuperNova