50

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

但它不起作用

4

11 回答 11

87

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

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

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

于 2015-11-30T10:56:11.757 回答
17

你可以检查它db.settings

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

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

object._state.db

这将为您提供配置中的数据库键,例如“默认”,因此如果您在配置中有多个数据库,您可以检查正确的一个。

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

于 2013-08-20T19:54:57.343 回答
16

在 django 1.9 中测试

进入贝壳。

./manage.py shell

检查您的数据库。

from django import db
db.connections.databases
于 2016-12-03T07:52:39.917 回答
14

答案似乎已经过时了。

在 django 1.6 中,您可以执行以下操作:

from django import db
print db.connections.databases
于 2015-07-02T14:17:15.410 回答
13

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

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

感谢:https ://stackoverflow.com/a/18849255/1237092

于 2014-09-23T17:31:22.233 回答
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 运行。

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

于 2012-04-11T08:17:40.550 回答
2

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

SELECT DATABASE()
于 2016-02-04T20:20:03.623 回答
2

在 Django >= 1.10 版本中

采用:

from django.conf import settings
db_name = settings.DATABASES['default']['NAME']
于 2017-06-14T05:34:20.397 回答
1

在 Django >= 1.11

采用:

from django import db
db_name = db.utils.settings.DATABASES['default']['NAME']
于 2017-07-20T13:13:34.807 回答
1

在 mysql 的情况下,通过 django 进行原始查询也可以是一个解决方案。

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

print row[0]
于 2017-12-06T11:54:03.587 回答
1

要获取数据库 conf 和 NAME,您可以在任何应用程序中使用任何模型

from someapp.models import ExampleModels

current_DB = ExampleModels.objects.db
print (current_DB)
于 2020-05-20T13:38:22.437 回答