热门标签 | 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模块了


推荐阅读
  • binlog2sql,你该知道的数据恢复工具
    binlog2sql,你该知道的数据恢复工具 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • 本文详细探讨了在Web开发中常见的UTF-8编码问题及其解决方案,包括HTML页面、PHP脚本、MySQL数据库以及JavaScript和Flash应用中的乱码问题。 ... [详细]
  • mysql 授权!!
    为什么80%的码农都做不了架构师?MySQL的权限系统围绕着两个概念:认证-确定用户是否允许连接数据库服务器授权-确定用户是否拥有足够的权限执 ... [详细]
  • Django与Python及其他Web框架的对比
    本文详细介绍了Django与其他Python Web框架(如Flask和Tornado)的区别,并探讨了Django的基本使用方法及与其他语言(如PHP)的比较。 ... [详细]
  • 本文介绍了 PHP 的基本概念、服务器与客户端的工作原理,以及 PHP 如何与数据库交互。同时,还涵盖了常见的数据库操作和安全性问题。 ... [详细]
  • 本文详细介绍了MySQL InnoDB存储引擎中的Redo Log和Undo Log,探讨了它们的工作原理、存储方式及其在事务处理中的关键作用。 ... [详细]
  • 本文详细介绍如何在SSM(Spring + Spring MVC + MyBatis)框架中实现分页功能。包括分页的基本概念、数据准备、前端分页栏的设计与实现、后端分页逻辑的编写以及最终的测试步骤。 ... [详细]
  • 本文介绍了MySQL窗口函数的基本概念、应用场景及常见函数的使用方法。窗口函数在处理复杂查询时非常有用,例如计算每个用户的订单排名、环比增长率、以及动态聚合等。 ... [详细]
  • 1、编写一个Java程序在屏幕上输出“你好!”。programmenameHelloworld.javapublicclassHelloworld{publicst ... [详细]
  • 本文提供了处理WordPress网站中出现过多重定向问题的方法,包括检查DNS配置、安装SSL证书以及解决数据库连接错误等步骤。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • 解决ADODB连接Access时出现80004005错误的方法
    本文详细介绍了如何解决在使用ADODB连接Access数据库时遇到的80004005错误,包括错误原因分析和具体的解决步骤。 ... [详细]
  • 搭建个人博客:WordPress安装详解
    计划建立个人博客来分享生活与工作的见解和经验,选择WordPress是因为它专为博客设计,功能强大且易于使用。 ... [详细]
  • 如何在U8系统中连接服务器并获取数据
    本文介绍了如何在U8系统中通过不同的方法连接服务器并获取数据,包括使用MySQL客户端连接实例的方法,如非SSL连接和SSL连接,并提供了详细的步骤和注意事项。 ... [详细]
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社区 版权所有