DATABASE_ROUTERS在Django中使用多个MySQL数据库进行配置

  • 在Django中,默认使用的MySQL数据库为default, 如果不进行配置的话,迁移建表就会创建到default数据库

准备:

  • 先创建两个数据库
  • 在这里插入图片描述
  • 在创建一个管理员管理这两个库
  • 在这里插入图片描述
create user python identfied by "123456"   # 意思看图片吧
grant all on db_user.* to 'python'@'%';
grant all on db_order.* to 'python'@'%';
flush privileges;
  • 在这里插入图片描述

配置

  • 我是创建啦两个子应用app00001,app00002,配置主路由注册子应用(略)
  • 在工程配置文件settings.py文件中配置数据库
DATABASES = {
    
    
    'default': {
    
    
    # 就算不用这个, 留空也要写在配置中
    },
    'user': {
    
    
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '127.0.0.1',  # 数据库主机
        'PORT': 3306,  # 数据库端口
        'USER': 'python',  # 数据库用户名
        'PASSWORD': '123456',  # 数据库用户密码
        'NAME': 'db_user'  # 数据库名字
    },
    'order': {
    
    
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '127.0.0.1',  # 数据库主机
        'PORT': 3306,  # 数据库端口
        'USER': 'python',  # 数据库用户名
        'PASSWORD': '123456',  # 数据库用户密码
        'NAME': 'db_order'  # 数据库名字
    }
}

# 这个就是配置数据库的路由,来决定哪一个app下的表分配到哪个数据库
DATABASE_ROUTERS = ['django_py.dbRouterSetting.DatabaseRouter', ]
  • 我是在跟项目配置文件同级目录(django_py)中创建dbRouterSetting.py文件,内容如下
# -*- coding: utf-8 -*-

class DatabaseRouter(object):
    """
    A router to control all database operations on models in the
    auth application.
    """
    # 这是准备加入 db_user 数据库的app名字列表,
    # 如果决定吧那些app下创建的表就放到db_user中,就把app名字写到里面
    db_user_apps = (
        "app00001",
    )

    def db_for_read(self, model, **hints):
        """
        Attempts to read auth models go to default.
        """

        if model._meta.app_label in self.db_user_apps:
            return 'user'
        if model._meta.app_label in ["app00002",]:       # 这里也可以跟db_user_apps一样
            return 'order'								# 也可以使用一个变量接收到这个列表
        return None										# 意思就是把吧那些app下创建的表就放到
        												#db_order库中,就把app名字写到列表里面

    def db_for_write(self, model, **hints):
        """
        Attempts to write auth models go to default.
        """
        if model._meta.app_label in self.db_user_apps:
            return 'user'
        if model._meta.app_label in ["app00002",]:
            return 'order'
        return None

    def allow_migrate(self, db, app_label, model=None, **hints):
        """
        Make sure the auth app only appears in the 'default'
        database.
        """
        if app_label in self.db_user_apps:
            return db == 'user'
        if app_label in ["app00002"]:
            return db == 'order'
        return None

在模型类里面正常写就行,我模型类文件内容如下, (我没有自定义表名)
app00001/models.py


from django.db import models

# Create your models here.
class AbstractDefaultColumn(models.Model):
    date1 = models.DateTimeField(auto_now_add=True)
    date2 = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True
class Attention(AbstractDefaultColumn):
    name = models.CharField(max_length=255, default='')  # 笔名
    hot_score = models.PositiveIntegerField(default=0)  # 热度

app00002/models.py

from django.db import models
# Create your models here.
class AbstractDefaultColumn(models.Model):
    date1 = models.DateTimeField(auto_now_add=True)
    date2 = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True
        
class Professional(AbstractDefaultColumn):  # 艺术家
    penname = models.CharField(max_length=255, default='')  # 笔名
    hot_score = models.PositiveIntegerField(default=0)  # 热度

重要的来了

  • 在终端下进入与manage.py文件同级目录下
 python manage.py makemigrations 

注意下面的

 python manage.py migrate --database=user        # 同步到db_user数据
 python manage.py migrate --database=order		 # 在order生成应该在db_order库中的表

结果如下:

在这里插入图片描述

项目结构

  • 项目的名字就是django_py
.
├── app00001
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   ├── __init__.py
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── app00002
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   ├── __init__.py
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── django_py
│   ├── asgi.py
│   ├── dbRouterSetting.py
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

猜你喜欢

转载自blog.csdn.net/lxb_wyf/article/details/110223635
今日推荐