Django中不同应用使用分布式数据库

在一个Django应用中可以创建多个APP应用,每个APP应用都可以独立使用,在有多个APP的情况下,APP之间若数据库使用不一,如APP1使用的数据库IP与APP2使用的数据库IP不一致,或者APP1使用MYSQL,APP2使用PGSQL,那么就要对不同APP的数据库进行不同的设置。

以下为一次实际操作演示。

DATABASES ={

    'default': {

        'ENGINE': 'django.db.backends.sqlite3',

        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),

    },

    'db1': {

        'ENGINE': 'django.db.backends.mysql',

        'NAME': 'dbname1',

        'USER': 'your_db_user_name',

        'PASSWORD': 'yourpassword',

        "HOST": "localhost",

    },

    'db2': {

        'ENGINE': 'django.db.backends.mysql',

        'NAME': 'dbname2',

        'USER': 'your_db_user_name',

        'PASSWORD': 'yourpassword',

        "HOST": "localhost",

    },

}

# use multi-database in django

# add by WeizhongTu

DATABASE_ROUTERS =['{项目名称}.database_router.DatabaseAppsRouter']

DATABASE_APPS_MAPPING ={

    # example:

    #'app_name':'database_name',

    'app1': 'db1',

    'app2': 'db2',

}


setting.py截图

在project_name目录下创建一个database_route.py文件(即与setting.py同级的文件)

文件中写入:

    fromdjango.conf importsettings


DATABASE_MAPPING =settings.DATABASE_APPS_MAPPING



classDatabaseAppsRouter(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 = {'app1': 'db1', 'app2': 'db2'}

    """


    defdb_for_read(self, model, **hints):

        """"Point all read operations to the specific database."""

        ifmodel._meta.app_label inDATABASE_MAPPING:

            return DATABASE_MAPPING[model._meta.app_label]

        return None


    defdb_for_write(self, model, **hints):

        """Point all write operations to the specific database."""

        ifmodel._meta.app_label inDATABASE_MAPPING:

            return DATABASE_MAPPING[model._meta.app_label]

        return None


    defallow_relation(self, obj1, obj2, **hints):

        """Allow any relation between apps that use the same database."""

        db_obj1 =DATABASE_MAPPING.get(obj1._meta.app_label)

        db_obj2 =DATABASE_MAPPING.get(obj2._meta.app_label)

        ifdb_obj1 anddb_obj2:

            ifdb_obj1 ==db_obj2:

                return True

            else:

                return False

        return None


实际操作时:

python manage.py makemigrations {app} 创建存储

python manage.py migrate  同步数据库     

在代码中使用时候:

test=BlogT.objects.using('db1').get_or_create(title=title,content=content)

在object取得对象时候指定你使用的数据库 using(‘{setting的数据库}’)


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容