2013-12-12 70 views
1

我需要能够确定在Django中运行时使用的数据库类型。在Django中获取数据库类型

MYSQL = False 
if <something goes here>: 
    MYSQL = True 

我看到一个相关的Django票证,但没有完全让我接触到我的解决方案。 (https://code.djangoproject.com/ticket/18332

这将是一个很好的解决方案,我可以确定它是否是MySQL,PostgreSQL,SQLite,Oracle ......无论如何。

我试过挖掘django.db,但看不到任何帮助。

我会详细说明我想要做什么,因为它似乎被误解了。这是针对独立于任何Django项目的测试实用程序项目。我的工具需要了解哪个数据库被用来防止非法活动。

例如,我的软件包支持PostgreSQL hstore字段,但是在SQLite中不存在这样的字段。所以,如果他们使用SQLite,我不想允许特定的功能。

我有权访问与该实用程序一起使用的Django模型。

from my_app.models import Foo 

testing_utility(Foo, **kwargs) 

testing_utility签名是:

def testing_utility(klass, **kwargs): 
    instance = klass(**kwargs) 

现在,我不想在这个类瓶坯hstore特定功能,如果不是一个PostgreSQL数据库。这是否清除了一些?

编辑1:

谢谢,KevinDTimm的链接。看起来Django模型在实例化时确实有._state.db。当然,我的实例有一个None类型。 :(

>> print(instance._state.db) 
None 
+0

导入设置...... – KevinDTimm

+0

然后呢?什么设置将明确给我的数据库连接?一般来说,我不知道有什么数据库被命名。对于任何不知道的人来说,它都是来自“django.conf导入设置”。 – Rico

+0

http://stackoverflow.com/questions/10101602/how-to-know-current-name-of-the-database-in-django – KevinDTimm

回答

3

KevinDTimm导致我这一解决方案。谢谢!

https://stackoverflow.com/a/18343919/787716建议使用模型的._state.db参数来确定用于实例数据库的第一步。

但是,如果正在使用的数据库是settings.DATABASES['default']然后._state.dbNone

因此,我能够通过以下解决我的问题:

db_name = 'default' 
if instance._state.db is not None: 
    db_name = instance._state.db 
db_backend = settings.DATABASES[db_name]['ENGINE'].split('.')[-1] 
MYSQL = db_backend == 'mysql'