在Django中获取数据库类型

时间:2013-12-12 20:40:05

标签: python django orm

我需要能够确定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)

现在,如果不是PostgreSQL数据库,我不想在此课程中预先形成hstore特定功能。这会更清楚吗?

编辑1:

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

>> print(instance._state.db)
None

1 个答案:

答案 0 :(得分: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'