【问题标题】:How to know current name of the database in Django?如何知道Django中数据库的当前名称?
【发布时间】:2012-04-23 12:02:58
【问题描述】:

我正在我的 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)

但它不起作用

【问题讨论】:

    标签: python django unit-testing


    【解决方案1】:

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

    import sys
    
    management_command = sys.argv[1] if len(sys.argv) > 1 else ""
    
    TESTING = management_command.startswith("test")
    

    如果 TESTING 为真,则您正在使用 python manage.py test myapp 运行。

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

    【讨论】:

    • 我很高兴它有效。您希望以哪种方式更优雅的解决方案?
    • 我认为 in django 中有一些变量/函数,我可以从中获取当前数据库设置。
    • 知道了,我不知道,但也许其他人会。
    • 有很多可能的方式来运行测试,例如“manage.py jenkins”或“jtest”,或者您可以编写自己的测试运行程序。你可以为所有这些命令添加检测,但我担心六个月后你会忘记一个,然后你的测试会突然开始摧毁你的生产数据库。日子不好过。
    • @Jonathan Hartley 这是可能的,但在 django 中运行测试的默认方式是 ./manage.py test,此处记录:docs.djangoproject.com/en/dev/topics/testing/…。我正在解决这个问题。
    【解决方案2】:

    您可以在db.settings查看:

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

    要查看用于获取特定对象的数据库,您可以这样做:

    object._state.db
    

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

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

    【讨论】:

    • db 在 django 1.8 中没有属性“设置”
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      答案似乎已经过时了。

      在 django 1.6 中你可以这样做:

      from django import db
      print db.connections.databases
      

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

        • 在 Django 1.9 上测试也正常
        • Django 1.6 也可以
        • 也适用于 Django 2.1
        • 我只是对 Django 运行测试的数据库感兴趣。虽然settings_dict 可能会回答我的问题,但我发现django.db.connection.connection.dsndjango.db.connection.vendor 更让人放心。
        • 也适用于 Django 2.2
        【解决方案6】:

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

        SELECT DATABASE()
        

        【讨论】:

          【解决方案7】:

          在 django 1.9 中测试

          进入外壳。

          ./manage.py shell
          

          检查您的数据库。

          from django import db
          db.connections.databases
          

          【讨论】:

            【解决方案8】:

            在 Django >= 1.10 版本中

            用途:

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

            【讨论】:

            • 这没有回答问题。 Django 在测试时不会更新默认名称。
            【解决方案9】:

            在 Django >= 1.11

            用途:

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

            【讨论】:

              【解决方案10】:

              如果是 mysql,通过 django 进行原始查询也是一种解决方案。

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

              【讨论】:

              • psycopg2.errors.UndefinedFunction: function database() does not exist LINE 1: select database()
              【解决方案11】:

              要获取数据库配置和名称,您可以在任何应用程序中使用任何模型

              from someapp.models import ExampleModels
              
              current_DB = ExampleModels.objects.db
              print (current_DB)
              

              【讨论】:

              • 如何指定数据库,self.model.component.get_queryset() 使用default 数据库但我想使用不同的数据库连接即'stage' 或'prod',这里self.model.objects.db 返回'default'
              猜你喜欢
              • 2013-07-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-12-22
              • 2016-09-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多