django连接多数据库和表生成

有时候我们希望每个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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值