项目目录如下

Django—同一项目不同app使用不同数据库_MySQL

创建不同的app

python manage.py startapp app1
python manage.py startapp app2

settings.py注册app

INSTALLED_APPS = [
	#'app名.类名',         # 类名为app下apps.py文件中的类名
  "app1.apps.Db1Config",
  "app2.apps.Db2Config",
]

Django—同一项目不同app使用不同数据库_数据库_02

Django—同一项目不同app使用不同数据库_数据库_03


settings.py注册数据库

注:DATABASES中第一个数据库(即默认数据库)必须是'default',其他数据库名(即DATABASES中的键)可自定义(为使用方便,尽量与MySQL数据库名一致。此处为了理解,设置与MySQL数据库名不一致,且给其起名为Django数据库)

# Django数据库与MySQL数据库对应关系
DATABASES = {
	# 第一个键必须是default,默认数据库,其他键(即Django中数据库名)可自定义
 'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db1',  # MySQL中数据库名
        'USER': 'root',  # MySQL用户名
        'PASSWORD': 'Test1234',  # MySQL密码
        'HOST': '127.0.0.1',
        'PORT': '3306'
    },

    'default2': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db2',  # MySQL中数据库名
        'USER': 'root',  # MySQL用户名
        'PASSWORD': 'Test1234',  # MySQL密码
        'HOST': '127.0.0.1',
        'PORT': '3306'
    },
}


# 配置多个数据库的路径
# (djangoDemo为项目名,
# db_router为settings.py同目录的db_router.py
# DatabaseRouter为db_router.py中的类名
DATABASE_ROUTERS = ['dbtest.db_router.DatabaseRouter']

# app与Django数据库对应关系{'app名':'settings.py的DATABASES中对应的键'}
DATABASE_APPS_MAPPING = {
    'app1':'default',
    'app2':'default2'
    }

settings.py同目录下创建db_router.py

# coding:utf-8
from django.conf import settings

DATABASES = settings.DATABASE_APPS_MAPPING

class DatabaseRouter(object):
    def db_for_read(self,model,**hints):
        """ 数据库进行读操作时指向的数据库 """
        if model._meta.app_label in DATABASES:
            return DATABASES[model._meta.app_label]
        return None

    def db_for_write(self,model,**hints):
        """ 数据库进行写操作时指向的数据库 """
        if model._meta.app_label in DATABASES:
            return DATABASES[model._meta.app_label]
        return None

    def allow_migrate(self,db,app_label,model=None,**hints):
        """ 允许将模型转换为sql语句 """
        if db in DATABASES.values():
            return DATABASES.get(app_label) == db
        elif app_label in DATABASES:
            return False
        return None

models.py指定数据库

from django.db import models


class db1(models.Model):
    name1 = models.CharField(max_length=32)
    age1 = models.IntegerField()

    class Meta:
    	#db_table = "MySQL中显示的数据表名"
		#verbose_name_plural = u"后台显示的中文表名" 
        db_table = "db1"
        verbose_name_plural = u"表1"

        # 此处为app名,setting.py已设置app与Django数据库,Django数据库与MySQL数据库对应关系
        app_label = "app1"
# Create your models here.
from django.db import models


class db2(models.Model):
    name2 = models.CharField(max_length=32)
    addr2 = models.CharField(max_length=32)

    class Meta:
        db_table = "db2"
        verbose_name_plural = u"表2"

        # 此处为app名,setting.py已设置app与Django数据库,Django数据库与MySQL数据库对应关系
        app_label = "app2"

数据库迁移

python manage.py makemigrations

# 默认数据库迁移数据。即settings.py中DATABASES中的default数据库(即DATABASES中键default)
python manage.py migrate

# default2数据库迁移数据。即settings.py中DATABASES中default2数据库(即DATABASES中键default2)
python manage.py migrate --database=default2

views中数据库使用

# Create your views here.
from app1.models import db1
from app2.models import db2

# 此处default和default2为Django数据库名,即settings.py中DATABASES中的键
db1.objects.using('default').create(字段1='值1', 字段2='值2')
db2.objects.using('default2').filter(...)


‘’