python让不同的应用(app)使用不同的数据库

在seeting中做如下配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
     'newdjangodb':{
         'ENGINE': 'django.db.backends.mysql',
         'NAME': 'newdjangodb',  # 你的数据库名称
         'USER': 'root',  # 你的数据库用户名
        'PASSWORD': '123456',  # 你的数据库密码
         'HOST': '127.0.0.1',  # 你的数据库主机,留空默认为localhost
         'PORT': '3306',  # 你的数据库端口
}
}
# 以下MyProject改成项目名,默认default不用修改
DATABASE_ROUTERS = ['ProjectPrictice.database_router.DatabaseAppsRouter']#对数据库路由封装后在此配置好
DATABASE_APPS_MAPPING = {
    'chouti': 'default', #指明应用app用哪一个数据库
    'newdjangoapp': 'newdjangodb', #指明应用app用哪一个数据库
}

编写数据路由封装:

#__author:'joy'
#date:
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

在对应app中的modles中指明

#chouti数据库设计
class sengMsg(models.Model):
   nid=models.AutoField(primary_key=True)
   code=models.CharField(max_length=6)
   email=models.CharField(max_length=32,db_index=True)
   times=models.IntegerField(default=0)
   ctime=models.DateTimeField()
   class Meta:
      app_label = 'chouti' #指明app名字

这样就实现了多个应用来回切换开发

一边可以实现前后端分离编写,一边可以实现前后端不分离编写。

python让不同的应用(app)使用不同的数据库_第1张图片

python让不同的应用(app)使用不同的数据库_第2张图片

 同样可以畅想一下,如果多个应用需要协同开发 同样可以按照这种思路实现

你可能感兴趣的:(python,web前端,数据库,django,python)