簡體   English   中英

如何在 django 的同一個應用程序中使用不同的數據庫?

[英]How to use different database within same app in django?

我有一個名為 xyz 的應用程序,該應用程序中有 2 個視圖 view1.py 和 view2.py 我將路由器配置為

if model._meta.app_label == 'xyz'
    return database1

有沒有辦法從此應用程序“xyz”中選擇不同的數據庫。

我的意思是同一個應用程序中的兩個不同的數據庫。

有沒有辦法或者django首先允許這樣做。

與數據庫相關的東西的配置大部分在settings.py文件中完成。 因此,要將多個數據庫添加到我們的django項目中,我們需要將它們添加到DATABASES字典中。

這些設置在Settings.py

DATABASE_ROUTERS = ['path.to.DemoRouter']
DATABASE_APPS_MAPPING = {'user_data': 'users_db',
                        'customer_data':'customers_db'}

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
    'users_db': {
        'NAME': 'user_data',
        'ENGINE': 'django.db.backends.postgresql',
        'USER': 'postgres_user',
        'PASSWORD': 'password'
    },
    'customers_db': {
        'NAME': 'customer_data',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_cust',
        'PASSWORD': 'root'
    }
}

對於多個數據庫,最好談論數據庫路由器。 默認路由方案可確保如果未指定數據庫,則所有查詢都將回退到默認數據庫。 數據庫路由器默認為[]。

把它放在models.py

class DemoRouter:
    """
    A router to control all database operations on models in the
    user application.
    """
    def db_for_read(self, model, **hints):
        """
        Attempts to read user models go to users_db.
        """
        if model._meta.app_label == 'user_data':
            return 'users_db'
        elif model._meta.app_label == 'customer_data':
            return 'customer_db'
        return None

    def db_for_write(self, model, **hints):
        """
        Attempts to write user models go to users_db.
        """
        if model._meta.app_label == 'user_data':
            return 'users_db'
        elif model._meta.app_label == 'customer_data':
            return 'customer_db'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        """
        Allow relations if a model in the user app is involved.
        """
        if obj1._meta.app_label == 'user_data' or \
           obj2._meta.app_label == 'user_data':
           return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        """
        Make sure the auth app only appears in the 'users_db'
        database.
        """
        if app_label == 'user_data':
            return db == 'users_db'
        return None

各個模型將被修改為

class User(models.Model):
    username = models.Charfield(ax_length=100)
    . . .
        class Meta:
        app_label = 'user_data'

class Customer(models.Model):
    name = models.TextField(max_length=100)
    . . .
        class Meta:
        app_label = 'customer_data'

使用多個數據庫時,很少有有用的命令。

 $ ./manage.py migrate --database=users_db

上面是更多內容的正確答案,請參見此處的完整文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM