Django 中的多个数据库

Multiple Database in Django

我正在尝试使用 Django 创建一个 Q/A 网站,我想为所有应用程序使用多个数据库

但我不想重新配置我的模型和应用程序。

我该怎么做?

N.B:论坛是实现Q/A网站的应用程序

我的意思是,您显然需要进行一些重新配置。

大体上,将最常用的数据库设置为默认数据库,将另一个数据库设置为其他数据库 - 这是根据我的一个生产站点的数据库列表改编的。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'databasename',
        'USER': 'mydefaultuser',
        'PASSWORD': 'novelpassword',
        'HOST':'first-host.com',
        'PORT':'3306'
    },
    'auth': {
        'ENGINE': 'sqlserver_pymssql',
        'HOST': 'myserver.com',
        'NAME': 'myauthdatabase',
        'PASSWORD': 'passwordhere',
        'PORT': 1433,
        'USER': 'username'
    }}

然后您可以在视图中显式使用其他数据库,使用 usingUser.objects.using('auth').all()

...或者最好,您可以使用 Database Router:

更广泛地设置它
class AuthRouter(object):
    """
    A router to control all database operations on models in the
    auth application.
    """
    def db_for_read(self, model, **hints):
        """
        Attempts to read auth models go to auth_db.
        """
        if model._meta.app_label == 'auth':
            return 'auth_db'
        return None

    def db_for_write(self, model, **hints):
        """
        Attempts to write auth models go to auth_db.
        """
        if model._meta.app_label == 'auth':
            return 'auth_db'
        return None

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

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

在您的设置文件中添加 DATABASE_ROUTERS = ['path.to.AuthRouter', 'path.to.PrimaryReplicaRouter'] - 这些只是从上面链接的文档中提取的示例,但它相对简单。

说,除非你有一个超级清晰和简洁的理由为什么你想这样做,否则不要这样做它。您可以在一个数据库中处理所有这些,一旦您走多数据库路线,您就会立即 cross-database limitations - 永远值得牢记。