Django笔记三十七之多数据库操作(补充版)

本文首发于公众号:Hunter后端

原文链接:Django笔记三十七之多数据库操作(补充版)

这一篇笔记介绍一下 Django 里使用多数据库操作。

在第二十二篇笔记中只介绍了多数据库的定义、同步命令和使用方式,这一篇笔记作为补充详细介绍如何对 Django 系统的多个数据库进行针对的建表同步操作。

以下是本篇笔记目录:

  1. DATABASES 定义
  2. application创建和设置
  3. migration 和 migrate 操作
  4. 几个注意的点

1、DATABASES 定义

这里还是复用之前的 Django 系统,这里我们额外建立两个数据库连接,之前的 default 还是不变:

# 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、application创建和设置

接下来我们以 application 为整体来指定 model 对数据库进行操作。

上面这句话这里释义一下,就是说针对多个数据库,我们这里默认使用整个 application 下的 model 表与之对应,比如说 new_user 这个 app 下的 model 的 migration 操作都写入 DATABASE 下 user 对应的数据库。

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

创建application

首先,我们分别创建两个 application,一个 application 名为 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',
    ...
]

application与数据库的对应设置

然后设置 application 与 DATABASE 的对应关系:

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

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

比如这里我们将 new_user 这个 app 指定到了 user 数据库。

创建 model

接下来我们分别在两个 application 下创建对应的 model:

# 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"

在这两个 model 里,我手动给其添加了 app_label 字段,值为各自所在 application 下的名,表示这个 model 是从属于 app_label 这个 application 下。

其实对于每个 model,meta 信息下都会有这个字段,默认值为该 model 所处的 application 的名称,这里为了显示对比,我额外标记了出来。

查看 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 model 使用的就是 user 这个数据库。

接下来我们可以进行 migration 操作来测试将表结构写入 user 数据库。

3、migration 和 migrate 操作

接下来我们创建 migration 文件:

python3 manage.py makemigrations new_user

python3 manage.py makemigrations other_info

然后会在 new_user 和 other_info 下分别创建对应的 migration 文件。

接下来进行 migrate 的时候需要指定 database 参数,也就是我们前面 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 里的映射关系,--database 对应的参数就是相应的数据库。

执行完上面的命令之后,在两个对应的数据库里就会创建 django_migrations 表和 model 对应的表。

创建 django_migrations 表是因为每个 database 也需要记录各自的 migration 迁移记录。

至此,我们就将 application 下的 model 和 database 对应了起来。

4、几个注意的点

数据的增删改查

前面我们将 model 和 database 对应了起来之后,在操作对应的 model 的时候还是需要 using() 来指定操作的 database:

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

default数据库

在这篇笔记里,我们另外设置了两个数据库用于对应新建的 application,且在 DATABASE_APPS_MAPPING 中设置了 application 到 database 的映射,那么没有设置映射关系的 application 下的 model 其实就还是默认属于 default 数据库的。

比如我们之前创建的 blog 这个 application,就相当于是:

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

不过因为是默认设置,所以为了方便我们没有显式的设置出来。

并且,对于多个 application 是可以对应同一个数据库链接的,比如我们默认的 default,没有设置的 application 都对应的是 default 的数据库链接。

假设我们又创建了一个名为 article 的 app,也想要对应 other 数据库,可以这样操作:

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

某 app 下设置其他 app 的 model

这个操作是否可以呢?

可以,假设我们在 new_user 下创建一个 model,但是设置的是 other_info 的 app_label:

# new_user/models.py

class OtherInfoInNewUser(models.Model):
    pass

    class Meta:
        app_label = "other_info"

然后我们对 new_user 这个 app 执行下面的操作是检测不到有新 migration 的

python3 manage.py makemigrations new_user

因为当我们 makemigrations 指定 app 名称的时候,系统会去检测这个 app 下是否有属于这个 app 的新的 model 变化,而我们设置 OtherInfoInNewUser 这个 model 却从属于 other_info,所以是检测不到变化的。

只有当我们执行:

python3 manage.py makemigrations other_info

这个操作的时候,系统才会检测到 app_label='other_info' 的 model 的变化,然后创建新的 migration。

上面这个操作虽然是可行的,但是为了统一管理,还是不推荐这么操作。

如果想获取更多后端相关文章,可扫码关注阅读:
image

原文链接:https://www.cnblogs.com/hunterxiong/p/17379315.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django笔记三十七之多数据库操作(补充版) - Python技术站

(0)
上一篇 2023年5月6日
下一篇 2023年5月7日

相关文章

  • 关于Python的一些学习总结

    以下是关于 Python 学习总结的完整攻略: 问题描述 Python 是一种高级编程语言,具有简单易学、可读性强、功能强大等特点。本文将介绍 Python 的一些学习总结,包括基础语法、常用模块、面向对象编程等方面。 解决方法 1. 基础语法 1.1 变量 在 Python 中,变量是用来存储数据的容器。可以使用 = 运算符将数据赋值给变量。示例代码如下:…

    python 2023年5月13日
    00
  • python实现提取str字符串/json中多级目录下的某个值

    提取多级目录下的值是Python处理字符串和JSON数据的常见需求。下面是一些步骤,可以让你实现该功能。 将字符串或JSON数据转换为Python对象 如果你要从字符串中提取值,可以使用Python内置的字符串方法来加载它,例如json.loads。如果你已经有一个JSON数据,你可以使用Python的json库来加载它。你可以使用以下代码来加载JSON数据…

    python 2023年6月3日
    00
  • Python 变量类型实例详解

    Python 变量类型实例详解 Python 是一种强类型的半解释型脚本语言,所以在使用变量之前需要先定义变量的类型。在 Python 中有多种变量类型,本文将详细讲解这些变量类型,并提供几个实例说明。 Python 变量类型 Python 中常见的变量类型有以下几种: 数字(Number) Python 中的数字类型包括整数(int)、浮点数(float)…

    python 2023年6月5日
    00
  • python调用API实现智能回复机器人

    这里是关于“Python调用API实现智能回复机器人”的详细攻略。 概述 智能回复机器人是一种自动化的系统,它通过使用自然语言处理(NLP)和人工智能(AI)技术来理解人类自然语言并生成合适的回答。 在本攻略中,我们将探讨如何使用Python编写代码来调用API实现一个智能回复机器人。 步骤 步骤1:选择API服务提供商 我们需要选择一家适合的API服务提供…

    python 2023年5月18日
    00
  • Python读取Excel数据实现批量生成PPT

    下面是Python读取Excel数据实现批量生成PPT的完整实例教程。 1. 环境搭建 首先,需要安装 openpyxl 和 python-pptx 库: pip install openpyxl pip install python-pptx 2. Excel 数据读取 读取 Excel 数据可以使用 openpyxl 库,以下是一个示例代码: impor…

    python 2023年5月13日
    00
  • Odoo中如何生成唯一不重复的序列号详解

    生成唯一不重复的序列号在很多业务场景中是非常重要的,特别是涉及到订单、采购、库存等需要唯一标识的业务流程中。Odoo作为一款ERP系统,自然也内置了生成序列号的功能。下面就让我从Odoo中如何生成唯一不重复的序列号详解一下。 1. 在Odoo后台配置序列号 步骤如下: 进入Odoo后台,进入设置模块,选择“一般设置”。 找到“序列号”选项卡,添加一个你想要的…

    python 2023年6月3日
    00
  • Python pickle类库介绍(对象序列化和反序列化)

    当我们需要在Python程序中,将一个Python对象直接持久化至磁盘中,或是从磁盘中加载一个Python对象时,我们可以使用pickle类库。其实,pickle类库实现的是Python对象的序列化和反序列化。 接下来,我们将会详细讲解pickle类库的一些相关概念、函数的基本使用方法以及示例。 1. 序列化和反序列化 所谓序列化,即是将一个Python对象…

    python 2023年6月2日
    00
  • Python多线程 Queue 模块常见用法

    Python多线程 Queue 模块常见用法 多线程编程中,线程之间的通信是经常遇到的问题。Python中的Queue模块可以很好地解决这个问题。本文将详细讲解Queue模块的常用方法和使用场景。 基本用法 Queue模块提供了FIFO队列、LIFO队列,以及优先级队列三种数据结构。 import queue # 创建一个FIFO队列 fifo_queue …

    python 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部