有时候我们希望每个app使用不同的数据库,表模型创建后,可以迁移到对应的数据库中,这是我参考其他博主的方法写的,中间还因为一些问题导致迁移命令出现错误,现已改正,请食用
先展示我项目目录
1.在setting中添加数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1', # 数据库主机
'PORT': 3306, # 数据库端口
'USER': ''********', # 数据库用户名
'PASSWORD': '********', # 数据库用户密码
'NAME': 'blog' # 数据库名字
},
'video': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': '********',
'PASSWORD': '********',
'NAME': 'video'
}
}
2.添加数据库与app的映射
DATABASES_APPS_MAPPING = {
# 'app_name':'db_name'
'users': 'default',
'testapp': 'default',
'blogapp': 'default',
'videoapp': 'video',
}
3.建立数据库路由规则
这个database_router.py文件我是建立在与setting.py同级的,文件名称可以更改
from django.conf import settings
DATABASE_MAPPING = settings.DATABASES_APPS_MAPPING
class DatabaseAppsRouter(object):
def db_for_read(self, model, **hints):
"""
将所有读操作指向特定的数据库
"""
if model._meta.app_label in DATABASE_MAPPING:
return DATABASE_MAPPING[model._meta.app_label]
return 'default'
def db_for_write(self, model, **hints):
"""
将所有写操作指向特定的数据库
"""
if model._meta.app_label in DATABASE_MAPPING:
return DATABASE_MAPPING[model._meta.app_label]
return 'default'
def allow_syncdb(self, db, model):
"""
确保应用程序只出现在相关数据库中
"""
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_name=None, **hints):
"""
确定migrate操作是否可以在别名为db的数据库上运行
"""
if db in DATABASE_MAPPING.values():
return DATABASE_MAPPING.get(app_label) == db
elif app_label in DATABASE_MAPPING:
return False
return None
4.将路由导入到setting中
DATABASE_ROUTERS = ['blog.database_router.DatabaseAppsRouter']
5.建立表模型
注意app_label表示的是app的名称,另外其他的表模型可以不写app_label,默认使用default
from django.db import models
# Create your models here.
class Video(models.Model):
acg_video = models.IntegerField(u'av号', auto_created=True, primary_key=True)
name = models.CharField(u'名称', max_length=32)
author = models.CharField(u'作者', max_length=32)
upload_date = models.DateField(u'上传日期', auto_now_add=True)
pass_status = models.BooleanField(u'审核状态', default=False)
praise_points = models.SmallIntegerField(u'点赞数', default=0)
url = models.CharField(u'视频链接', max_length=255)
category = models.CharField(u'视频分类', max_length=10)
title = models.CharField(u'视频标题', max_length=64)
class Meta:
db_table = 'video'
verbose_name = u'视频'
verbose_name_plural = verbose_name
ordering = ['acg_video']
app_label = 'videoapp' # app名称
def __str__(self):
return self.name
class Video_Category(models.Model):
name = models.CharField(u'分类名', max_length=16, unique=True)
class Meta:
db_table = 'video_category'
verbose_name = u'视频分类'
verbose_name_plural = verbose_name
app_label = 'videoapp'
def __str__(self):
return self.name
6.执行迁移命令
- python manage.py makemigrations
- 迁移默认数据库,即default指定的数据库:
python manage.py migrate - 迁移默认video数据库,即video指定的数据库:
python manage.py migrate --database=video
这个video是setting中DATABASES的键名,不要与app_label搞混了(^U^)ノ~YO