美文网首页
Django中不同应用使用分布式数据库

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

作者: 不喜欢夜雨天 | 来源:发表于2018-04-23 14:16 被阅读0次

    在一个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的数据库}’)

    相关文章

      网友评论

          本文标题:Django中不同应用使用分布式数据库

          本文链接:https://www.haomeiwen.com/subject/mozklftx.html