2015-04-24 54 views
1

我在我的Django應用程序兩款車型,我想他們的表/數據庫存儲在單獨的DB/sqlite3的文件,而不是默認的「db.sqlite3」文件。 單Django應用程序使用多個sqlite3的文件數據庫



如:
我的models.py有兩類 列車總線,我希望他們能夠被存儲在 train.dbbus.db

+0

相關的問題,我發現:(http://stackoverflow.com/questions/16573108/single-django-app-using-two-databases)但是,我需要的**什麼就寫在** models.py的** **範例,** settings.py **和其他需要編寫的文件 – smitkpatel

+0

將它們存儲在單獨文件中的原因是什麼?你知道的[使用多個數據庫的侷限性(https://docs.djangoproject.com/en/1.8/topics/db/multi-db/#limitations-of-multiple-databases)? –

+0

我知道這一點。我真正想要做的是創建檔案文件。就像我在每個月末在我的程序中生成報告時一樣,我希望將表數據存儲在單獨的文件中,以便在將數據寫入文件時出現某種損壞。我不會放棄舊的。將所有內容保存到一個文件會使其變得龐大且易受攻擊 – smitkpatel

回答

6

當然,你總是可以只使用Train.objects.using('train')您的來電,並會選擇正確的數據庫(假設你在settings.py定義了一個名爲train數據庫。

如果你不想這樣做,我也有類似的問題,我調整我的解決方案到你的案件。這是部分基於this blog article和數據庫路由器Django文檔是here

有了這個解決方案當前的數據庫不會受到影響,但當前數據也不會被轉移到新的數據庫。根據您的Django版本,您需要包含allow_syncdballow_migrate的正確版本。

在settings.py:

DATABASES = { 
    'default': { 
     'NAME': 'db.sqlite3', 
     'ENGINE': 'django.db.backends.sqlite3', 
    }, 
    'train': { 
     'NAME': 'train.db', 
     'ENGINE': 'django.db.backends.sqlite3', 
    }, 
    'bus': { 
     'NAME': 'bus.db', 
     'ENGINE': 'django.db.backends.sqlite3', 
    }, 
} 


DATABASE_ROUTERS = [ 'yourapp.DatabaseAppsRouter'] 

DATABASE_APPS_MAPPING = {'train': 'train', 'bus': 'bus'} 

在一個新的文件名爲database_router.py:

from django.conf import settings 

class DatabaseAppsRouter(object): 
    """ 
    A router to control all database operations on models for different 
    databases. 

    In case an app is not set in settings.DATABASE_APPS_MAPPING, the router 
    will fallback to the `default` database. 

    Settings example: 

    DATABASE_APPS_MAPPING = {'model_name1': 'db1', 'model_name2': 'db2'} 

    """ 

    def db_for_read(self, model, **hints): 
     """Point all read operations to the specific database.""" 
     return settings.DATABASE_APPS_MAPPING.get(model._meta.model_name, None) 

    def db_for_write(self, model, **hints): 
     """Point all write operations to the specific database.""" 
     return settings.DATABASE_APPS_MAPPING.get(model._meta.model_name, None) 

    def allow_relation(self, obj1, obj2, **hints): 
     """Have no opinion on whether the relation should be allowed.""" 
     return None 

    def allow_syncdb(self, db, model): # if using Django version <= 1.6 
     """Have no opinion on whether the model should be synchronized with the db. """ 
     return None 

    def allow_migrate(db, model): # if using Django version 1.7 
     """Have no opinion on whether migration operation is allowed to run. """ 
     return None 

    def allow_migrate(db, app_label, model_name=None, **hints): # if using Django version 1.8 
     """Have no opinion on whether migration operation is allowed to run. """ 
     return None 

(編輯:這也是什麼喬伊·威廉建議)

+0

感謝您爲代碼示例的工作。 :)這正是我想到的。 –

相關問題