Code前端首页关于Code前端联系我们

Django笔记:多数据库操作(补充版)

terry 2年前 (2023-09-24) 阅读数 59 #后端开发

本笔记是对Django系统中如何对多个数据库进行定向建表和同步操作的补充和详细介绍。

以下是本笔记的目录:

  1. 数据库定义
  2. 应用程序创建和设置
  3. migration和migrate操作
  4. 几点注意事项1。 DATABASES定义

    这里通过复用之前的Django系统,这里我们又建立了两个数据库连接。之前的默认不变:

    # hunter/settings.py
    
    DATABASES = {
        'default': {
            ...
        },
        'user': {
            'ENGINE': "django.db.backends.mysql",
            'NAME': "db_1",
            "USER": "root",
            "PASSWORD": "123456",
            "HOST": "192.168.1.10",
            "PORT": 3306,
        },
        'other': {
            'ENGINE': "django.db.backends.mysql",
            'NAME': "db_2",
            "USER": "root",
            "PASSWORD": "123456",
            "HOST": "192.168.1.11",
            "PORT": 3306,
        },
    }
    

    数据库中的连接名称分别为user和other。

    注意,这里我们使用不同的数据库DATABASE,即db_1和db_2。它们可以位于 MySQL 中的相同地址或不同地址。

    2。应用程序创建和设置

    接下来,我们将应用程序作为一个整体来指定为数据库提供服务的模型。

    上面这句话解释到这里,就是对于多个数据库,默认情况下我们用整个应用下的model表来对应。例如,migration动作是由new_user app下的模型写入DATABASE对应数据库下的用户。

    当然,这个操作的过程中我们还需要在settings.py中定义一个映射DATABASE_APPS_MAPPING,这个我们后面会讲到。

    创建应用程序

    首先我们创建两个应用程序,一个名为new_user,另一个名为other_info。使用如下命令创建:

    python3 manage.py startapp new_user
    
    python3 manage.py startapp other_info
    

    然后这两个文件就会出现在系统文件夹根目录下。

    然后在settings.py中注册这两个app:

    # hunter/settings.py
    
    INSTALLED_APPS = [
        ...
        'new_user.apps.NewUserConfig',
        'other_info.apps.OtherInfoConfig',
        ...
    ]
    

    应用程序和数据库的对应设置

    然后设置应用程序和DATABASE的对应关系:

    DATABASE_APPS_MAPPING = {
        "new_user": "user",
        "other_info": "other",
    }
    

    这里这个映射名称的关键是我们的application,value是settings.py中DATABASES对应的数据库的key。

    例如,这里我们将new_user应用程序分配给用户数据库。

    创建模型

    接下来我们在两个应用下创建对应的模型:

    # new_user/models.py
    
    from django.db import models
    
    class NewUser(models.Model):
        pass
    
        class Meta:
            app_label = "new_user"
    
    # other_info/models.py
    
    from django.db import models
    
    class OtherInfo(models.Model):
        pass
    
        class Meta:
            app_label = "other_info"
    

    在这两个模型中,我手动为其添加了字段app_label,值为各自应用下的名称。指示此模型是 app_label 应用程序的子级。

    其实每个型号的元信息下都会有这个字段。默认值为模型所在应用程序的名称。我也在这里标注出来,方便对比。

    查看app_label的方法是:

    from new_user.models import NewUser
    NewUser._meta.app_label
    
    # new_user
    

    在前面的settings.py中我们设置了DATABASE_APPS_MAPPING映射

    DATABASE_APPS_MAPPING = {
        "new_user": "user",
        "other_info": "other",
    }
    

    所以这里的NewUser模型使用的是用户数据库。

    接下来我们可以执行Putition操作来测试将表结构写入用户数据库。

    3。 migration和migrate操作

    现在我们创建migration文件:

    python3 manage.py makemigrations new_user
    
    python3 manage.py makemigrations other_info
    

    然后就会在new_user和other_info下创建相应的migration文件。

    下次执行migrate时,指定数据库参数,就是我们之前settings.py中DATABASES对应的key:

    python3 manage.py migrate new_user --database=user
    
    python3 manage.py migrate other_info --database=other
    

    根据settings.py中DATABASE_APPS_MAPPING中的映射关系,该参数对应 - -数据库 就是对应的数据库。

    执行上述命令后,会在两个对应的数据库中创建django_migrations表和model对应的表。

    创建 Django_migrations 表是因为每个数据库还必须注册自己的 migrations 迁移记录。

    至此我们已经将模型和应用下的数据库进行了匹配。

    4。需要注意的几个点

    添加、删除、编辑数据

    之前将模型映射到数据库后,我们在操作对应模型时仍然需要使用()来指定操作的数据库:

    from new_user.models import NewUser
    NewUser.objects.using("user").create(id=1)
    

    default数据库

    在本篇笔记中,我们再设置两个数据库来对应新创建的应用程序,并在DATABASE_APPS_MAPPING中设置应用程序到数据库的映射,然后设置应用程序下没有映射关系的模型。事实上,它默认仍然属于标准数据库。

    例如我们之前创建的博客应用程序对应的是:

    DATABASE_APPS_MAPPING = {
        "blog": "default",
        "new_user": "user",
        "other_info": "other",
    }
    

    但是,由于它是默认设置,因此为了方便我们没有明确指定它。

    此外,多个应用程序可以对应同一个数据库链接。比如我们默认的和无设置的应用程序都对应默认的数据库链接。

    假设我们创建另一个名为article的应用程序,并且也想响应其他数据库。我们可以这样做:

    DATABASE_APPS_MAPPING = {
        "blog": "default",
        "new_user": "user",
        "other_info": "other",
        "article": "other",
    }
    

    是否可以在某个应用程序下设置其他应用程序的型号

    这个操作可以吗?是的应用程序名称,系统会检测该应用程序下是否有属于该应用程序的新型号更改。但是,我们设置的 OtherInfoInNewUser 模型是 other_info 的子模型,因此无法检测到任何更改。

    只有当我们执行:

    python3 manage.py makemigrations other_info
    

    时,系统才会在模型中注册 app_label='other_info' 的更改,然后创建一个新的。

    上述操作虽然可以,但不建议用于整体管理。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门