2013-12-12 90 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'