- 在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