2012-04-11 12 views
12

Estoy escribiendo pruebas en mi proyecto django. Por ahora, tengo dos conexiones de bases de datos:¿Cómo saber el nombre actual de la base de datos en Django?

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

y la costumbre de conexión a 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) 

y quiero saber cuando mi proyecto se está ejecutando a través

python manage.py test myapp 

Porque cuando ejecutar pruebas, django crea automáticamente una base de datos separada (con nombre como test_db_name), pero en este caso Mongo seguirá ejecutándose con db_name. Probé:

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) 

pero no funciona

+0

¿Has probado esto (https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-TEST_NAME) en la configuración mongodb en Django? Nunca usé mongodb con django, así que no estoy seguro si lo configuras de esa manera. – Fred

+0

Sí, pero la pregunta es: ¿cómo puedo identificar qué configuración debo usar? connections ['default']. settings_dict es solo _dict_ –

+1

Ninguno de los elementos de formato parece funcionar. Lo siento, esto es feo. Subir al nivel superior y explorar "./manage.py shell" >>> desde conexiones de importación django.db >>> connections.databases ['default'] {'ENGINE': 'django.db. backends.mysql ',' TEST_MIRROR ': Ninguno,' NAME ':' xxxx ',' TEST_CHARSET ': Ninguno,' TIME_ZONE ':' America/Chicago ',' TEST_COLLATION ': Ninguno,' OPTIONS ': {},' HOST ':' localhost ',' USER ':' xxxx ',' TEST_NAME ': None,' PASSWORD ':' xxxx ',' PORT ':' '} ¿Alguna de estas entradas de TEST_FOO puede aparecer cuando se prueban? –

Respuesta

1

trate de poner lo siguiente en el archivo de configuración:

import sys 

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

TESTING = management_command.startswith("test") 

Si la prueba es verdadera está ejecutando con miaplicacion prueba manage.py pitón.

editar: Probablemente pueda colocarlo en cualquier lugar, no necesariamente en su archivo de configuración. ¡Dale una oportunidad y mira cómo funciona!

+0

Funciona. Pero todavía estoy interesado en una solución más elegante. –

+0

Me alegra que funcione. ¿De qué manera quieres que una solución sea más elegante? – joshcartme

+0

Pensé que hay una variable/función ** en ** django desde la cual puedo obtener la configuración actual de la base de datos. –

12

Puede comprobarlo en db.settings:

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

Para ver la base de datos se utiliza para buscar un objeto específico que puede hacer:

object._state.db 

esto le dará la clave de la base de datos de configuración, tales como 'predeterminado', por lo que si tiene varias bases de datos en la configuración puede marcar la correcta.

Cuando ejecuta pruebas, db.settings debe actualizarse para que contenga el nombre de la base de datos específica de la prueba.

+9

db no tiene atributo 'configuración' en django 1.8 – szeitlin

9

La respuesta parece ser obsoleta.

En Django 1.6 que puede hacer:

from django import db 
print db.connections.databases 
22

para obtener el nombre db con versiones de Django recientes (tratado con 1,8):

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

ser conscientes de la lectura de este valor después de la inicialización, por lo que tiene el valor correcto cuando se ejecutan pruebas unitarias.

+1

Probó bien con Django 1.9 también –

+0

Está bien con Django 1.6 también –

1

Lo que funcionó excelente para mí (el diccionario estaba vacío en mi caso porque estoy usando un archivo read_default_file en settings.py) está a la ejecución de la siguiente consulta SQL

SELECT DATABASE() 
4

Probado en Django 1.9

Entra al caparazón.

./manage.py shell 

Revise sus bases de datos.

from django import db 
db.connections.databases 
1

En Django> = versión 1,10

Uso:

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

En Django> = 1,11

Uso:

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

El uso de la consulta cruda de mysql a través de django también puede ser una solución.

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

print row[0] 
Cuestiones relacionadas