zoukankan      html  css  js  c++  java
  • Django项目连接多个数据库配置

    1、设置数据库连接

    pip install PyMySQL

    2、在项目同名目录myproject/myproject下的__init__.py添加以下代码

    import pymysql
    pymysql.install_as_MySQLdb()

    3、修改settings.py中默认的数据库 default

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql', #数据库引擎
              'NAME': 'pythondms',                       #数据库名
              'USER': 'root',                       #用户名
              'PASSWORD': '',                   #密码
              'HOST': '36.103.245.29',                           #数据库主机,默认为localhost
              'PORT': '3306',                           #数据库端口,MySQL默认为3306
              'OPTIONS': {
                 'autocommit': True,
             }
        }
    }

    4、多数据库连接配置

    #数据库配置
    DATABASES = {
       'default': {
              'ENGINE': 'django.db.backends.mysql', #数据库引擎
              'NAME': 'pythondms',                       #数据库名
              'USER': 'root',                       #用户名
              'PASSWORD': '',                   #密码
              'HOST': '36.103.245.29',                           #数据库主机,默认为localhost
              'PORT': '3306',                           #数据库端口,MySQL默认为3306
              'OPTIONS': {
                 'autocommit': True,
             }
        },
        'default1': {
              'ENGINE': 'django.db.backends.mysql', #数据库引擎
              'NAME': 'pythondms',                       #数据库名
              'USER': 'root',                       #用户名
              'PASSWORD': '',                   #密码
              'HOST': '39.107.35.95',                           #数据库主机,默认为localhost
              'PORT': '3306',                           #数据库端口,MySQL默认为3306
              'OPTIONS': {
                 'autocommit': True,
             }
        }
    }
    DATABASE_ROUTERS = ['dms.database_router.DatabaseAppsRouter']
    DATABASE_APPS_MAPPING = {
        'userctrl': 'default',
        'app02': 'default1',
    }

    这里配置了一个数据库路由dms.database_router.DatabaseAppsRouter,然后对指定app指定了数据库,'userctrl': 'default', 'app02': 'default',。下面我们需要在唉项目同名目录myproject/myproject下新建一个database_router.py来实现数据库路由。

    # database_router.py
    from django.conf import settings
    
    DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING
    
    
    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 = {'app1': 'db1', 'app2': 'db2'}
        """
    
        def db_for_read(self, model, **hints):
            """"Point all read operations to the specific database."""
            if model._meta.app_label in DATABASE_MAPPING:
                return DATABASE_MAPPING[model._meta.app_label]
            return None
    
        def db_for_write(self, model, **hints):
            """Point all write operations to the specific database."""
            if model._meta.app_label in DATABASE_MAPPING:
                return DATABASE_MAPPING[model._meta.app_label]
            return None
    
        def allow_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)
            if db_obj1 and db_obj2:
                if db_obj1 == db_obj2:
                    return True
                else:
                    return False
            return None
    
        def allow_syncdb(self, db, model):
            """Make sure that apps only appear in the related database."""
    
            if db in DATABASE_MAPPING.values():
                return DATABASE_MAPPING.get(model._meta.app_label) == db
            elif model._meta.app_label in DATABASE_MAPPING:
                return False
            return None
    
        def allow_migrate(self, db, app_label, model=None, **hints):
            """
            Make sure the auth app only appears in the 'auth_db'
            database.
            """
            if db in DATABASE_MAPPING.values():
                return DATABASE_MAPPING.get(app_label) == db
            elif app_label in DATABASE_MAPPING:
                return False
            return None
    
        # for Django 1.4 - Django 1.6
        def allow_syncdb(self, db, model):
            """Make sure that apps only appear in the related database."""
     
            if db in DATABASE_MAPPING.values():
                return DATABASE_MAPPING.get(model._meta.app_label) == db
            elif model._meta.app_label in DATABASE_MAPPING:
                return False
            return None
     
        # Django 1.7 - Django 1.11
        def allow_migrate(self, db, app_label, model_name=None, **hints):
            # print db, app_label, model_name, hints
            if db in DATABASE_MAPPING.values():
                return DATABASE_MAPPING.get(app_label) == db
            elif app_label in DATABASE_MAPPING:
                return False
            return None
                

    这样我们就实现了不同app使用不同的数据库了,我们可以使用python manage.py migrate --database=mysql02命令来实现数据库同步(创建表)

  • 相关阅读:
    SSM添加数据后自动获取ID
    EasyUI分页
    JavaScript增强AJAX基础
    高德地图MapAPI地图展示
    项目json代码
    JavaScript 事件机制
    JavaScript event flow
    java和JavaScript的区别
    history of program
    javaScript obj
  • 原文地址:https://www.cnblogs.com/xcsg/p/11446990.html
Copyright © 2011-2022 走看看