如何知道Django中数据库的当前名称?

时间:2012-04-11 07:24:51

标签: python django unit-testing

我正在我的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会自动创建单独的DB(名称类似于 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)

但它不起作用

10 个答案:

答案 0 :(得分:43)

使用最近的Django版本获取数据库名称(尝试使用1.8):

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

请注意在初始化后读取此值,以便在运行单元测试时它具有正确的值。

答案 1 :(得分:13)

您可以在db.settings

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

要查看用于获取特定对象的数据库,您可以执行以下操作:

object._state.db

这将为您提供配置中的数据库密钥,例如“default”,因此如果您在配置中有多个数据库,则可以选中正确的数据库。

运行测试时,应更新db.settings以包含特定于测试的数据库名称。

答案 2 :(得分:10)

答案似乎已经过时了。

在django 1.6中你可以做到:

from django import db
print db.connections.databases

答案 3 :(得分:7)

IMO,最好的方法是使用以下未记录的django函数:

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

请求:https://stackoverflow.com/a/18849255/1237092

答案 4 :(得分:2)

尝试将以下内容放入您的设置文件中:

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。

编辑:你可能可以把它放在任何地方,不一定是你的设置文件。试一试,看看它是如何运作的!

答案 5 :(得分:2)

在Django> = 1.10版本

使用:

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

答案 6 :(得分:1)

对我来说非常有效(在我的情况下字典是空的,因为我在read_default_file中使用settings.py文件)只是执行以下SQL查询

SELECT DATABASE()

答案 7 :(得分:1)

在Django> = 1.11

使用:

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

答案 8 :(得分:0)

通过django使用mysql原始查询,也可以是一个解决方案。

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

print row[0]

答案 9 :(得分:0)

另一种方法是从模型中获取

如果settings.py具有以下数据库设置,

...

DATABASES = {
    'CLIENT': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'somedb',
        'USER': 'someuser',
        'PASSWORD': 'somepwd123',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}
...

要获取数据库conf和NAME,我们可以执行以下操作

from django.conf import settings
from someapp.models import ExampleModels

DB_CONF = ExampleModels.objects.db
print (DB_CONF)
# CLIENT


print (settings.DATABASES[DB_CONF]['NAME'])
# somedb