热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Django配置多个数据库(两种方法)

Django配置多个数据库第一种方法(使用默认数据库配置)第二种方法(不使用默认数据库配置)两种方法均为:不同


Django配置多个数据库

    • 第一种方法(使用默认数据库配置)
    • 第二种方法(不使用默认数据库配置)




两种方法均为:不同APP使用不同数据库


第一种方法(使用默认数据库配置)

准备一个可以跑的通的Django项目


  1. 【settings.py操作】打开项目文件夹下的主文件夹中的settings.py文件,如下图,我的默认数据库设置的是阿里云远程数据库,然后新增一个本地数据库取名“db1
    在这里插入图片描述

  2. 【settings.py操作】添加数据库路由参数

    DATABASES_APPS_MAPPING = {'author': 'default', # 数据库与APP应用一一对应'zydata': 'db1', # 数据库与APP应用一一对应
    }

    参数名需要和APP应用名一一对应,如下图:
    在这里插入图片描述

  3. 【在主Module文件夹中添加路由文件操作】编写数据库路由文件database_app_router.py(此文件为功能文件,直接复制粘贴即可,详细看第二种方法)

    from django.conf import settingsclass DatabaseAppsRouter(object):
    def db_for_read(self, model, **hints):app_label = model._meta.app_labelif app_label in settings.DATABASES_APPS_MAPPING:res = settings.DATABASES_APPS_MAPPING[app_label]return resreturn Nonedef db_for_write(self, model, **hints):app_label = model._meta.app_labelif app_label in settings.DATABASES_APPS_MAPPING:return settings.DATABASES_APPS_MAPPING[app_label]return Nonedef allow_relation(self, obj1, obj2, **hints):# 获取对应数据库的名字db_obj1 = settings.DATABASES_APPS_MAPPING.get(obj1._mata.app_label)db_obj2 = settings.DATABASES_APPS_MAPPING.get(obj2._mata.app_label)if db_obj1 and db_obj2:if db_obj1 == db_obj2:return Trueelse:return Falsereturn Nonedef db_for_migrate(self, db, app_label, model_name=None, **hints):if db in settings.DATABASES_APPS_MAPPING.values():return settings.DATABASES_APPS_MAPPING.get(app_label) == dbelif app_label in settings.DATABASES_APPS_MAPPING:return Falsereturn None

  4. 【settings.py操作】添加指向数据库路由文件的路由变量

    # 配置数据库的路由,里面的参数以.为分割,分别是Module文件夹名.数据库路由配置文件.数据库路由配置文件中的方法
    DATABASE_ROUTERS = ['notedrf.database_app_router.DatabaseAppsRouter']

  5. 如果还没有MySQL数据库表的话,以上配置结束就可以在各个APP中编辑models.py中的数据库表结构了。编辑完成后同步数据库,如下:

    python manage.py makemigrations
    python manage.py migrate --database=db1
    python manage.py migrate

  6. 如果已经存在MySQL数据库表的话,那么只需要对mysql数据库表来反向映射结构到models.py中即可。例如针对已存在的本地数据库db1进行反向映射,在Terminal终端中输入以下命令,将会得到反向映射后的代码,如下:

    python manage.py inspectdb --database db1

    在这里插入图片描述
    将代码复制粘贴到对应APP应用下的models.py中即可

  7. 以上过程完成后,就可以在对应APP应用下的视图中引用models模块了


第二种方法(不使用默认数据库配置)

第二种方法和第一种大致类似,只不过没有使用默认数据库选项和修改了数据库路由文件


  1. 【settings.py数据库配置】本次没有使用默认数据库配置,但是default不可少,需要设置为空,如下图:
    在这里插入图片描述

  2. 【settings.py操作】添加指向数据库路由文件的路由变量,如上图最后一行

    #配置数据库的路由
    DATABASE_ROUTERS = [‘notedrf.db_setting_router.DatabaseRouter’, ]

  3. 【在主Module文件夹中添加路由文件操作】编写数据库路由文件db_setting_router.py

    class DatabaseRouter(object):# 如果决定把哪个APP下创建的表放到db0中,就把APP名字写到里面db_author_apps = ("author",)def db_for_read(self, model, **hints):if model._meta.app_label in self.db_author_apps:return 'db0'if model._meta.app_label in ["zydata",]: # 需要把哪个APP放到db1中,就把哪个APP名字写在列表中return 'db1'return Nonedef db_for_write(self, model, **hints):if model._meta.app_label in self.db_author_apps:return 'db0'if model._meta.app_label in ["zydata",]:return 'db1'return Nonedef allow_migrate(self, db, app_label, model=None, **hints):if app_label in self.db_author_apps:return db == 'db0'if app_label in ["zydata"]:return db == 'db1'return None

  4. 剩下的编辑数据库、同步数据库即可,具体见第一种方法第5步

  5. 以上过程完成后,就可以在对应APP应用下的视图中引用models模块了


推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文讨论了将HashRouter改为Router后,页面全部变为空白页且没有报错的问题。作者提到了在实际部署中需要在服务端进行配置以避免刷新404的问题,并分享了route/index.js中hash模式的配置。文章还提到了在vueJs项目中遇到过类似的问题。 ... [详细]
  • 很多时候在注册一些比较重要的帐号,或者使用一些比较重要的接口的时候,需要使用到随机字符串,为了方便,我们设计这个脚本需要注意 ... [详细]
author-avatar
雪蝴蝶的诺言forever
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有