项目目录如下

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

创建不同的app

python manage.py startapp app1
python manage.py startapp app2
  • 1.
  • 2.

settings.py注册app

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

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

Django—同一项目不同app使用不同数据库_MySQL_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'
    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.

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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.

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"
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
# 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"
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

数据库迁移

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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

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(...)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.


‘’