django使用多个数据库的方法实例


Posted in Python onMarch 04, 2021

通过官方文档https://docs.djangoproject.com/zh-hans/3.1/topics/db/multi-db/和csdnhttps://blog.csdn.net/songfreeman/article/details/70229839的这两篇文章可以进行多数据库的设置。但是设置后可能会出现问题,由于我连接的数据库是通过inspactdb的方法得到的model。于是在migrate的时候出现了问题,会提示 1146, “Table xxx doesn't exist” 。后来发现问题可能出在路由表上,按照DATABASE_APPS_MAPPING映射之后,django默认的表如果要写入可能会找不到数据库。而源代码里的映射关系并不包含新加入的app,例如grappelli等。

DATABASE_APPS_MAPPING = {
# example:
# 'app_name':'database_name',
# 'admin': 'default',
# 'users': 'default', #django
'basic_estate': 'basic_estate',
'footstone': 'footstone',
'mall': 'hsmall',
'iot_biz': 'iot_biz',
'mall': 'mall',
'hsuser': 'hsuser',
}

如果要解决这个问题可以修改router代码,在映射关系内找不到对应的数据库的情况下返回默认数据库连接即可:

# -*- coding: utf-8 -*-
"""
@author: obaby
@license: (C) Copyright 2013-2020, obaby@mars.
@contact: root@obaby.org.cn
@link: http://www.obaby.org.cn
  http://www.h4ck.org.cn
  http://www.findu.co
@file: atabase_router.py.py
@time: 2021/2/26 9:07
@desc:
"""
from django.conf import settings
 
DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING
 
 
class DatabaseAppsRouter(object):
 """
 A router to control all database operations on models for different
 databases.
 
 In case an app is not set in settings.DATABASE_APPS_MAPPING, the router
 will fallback to the `default` database.
 
 Settings example:
 
 DATABASE_APPS_MAPPING = {'app1': 'db1', 'app2': 'db2'}
 """
 
 def db_for_read(self, model, **hints):
  """"Point all read operations to the specific database."""
  if model._meta.app_label in DATABASE_MAPPING:
   return DATABASE_MAPPING[model._meta.app_label]
  return 'default'
 
 def db_for_write(self, model, **hints):
  """Point all write operations to the specific database."""
  if model._meta.app_label in DATABASE_MAPPING:
   return DATABASE_MAPPING[model._meta.app_label]
  return 'default'
 
 def allow_relation(self, obj1, obj2, **hints):
  """Allow any relation between apps that use the same database."""
  db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label)
  db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label)
  if db_obj1 and db_obj2:
   if db_obj1 == db_obj2:
    return True
   else:
    return False
  return None
 
 def allow_syncdb(self, db, model):
  """Make sure that apps only appear in the related database."""
 
  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=None, **hints):
  """
  Make sure the auth app only appears in the 'auth_db'
  database.
  """
  if db in DATABASE_MAPPING.values():
   return DATABASE_MAPPING.get(app_label) == db
  elif app_label in DATABASE_MAPPING:
   return False
  return None

这样django系统所需的数据库就能正常创建了:

django使用多个数据库的方法实例

总结

到此这篇关于django使用多个数据库的文章就介绍到这了,更多相关django多数据库内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python基于Tkinter库实现简单文本编辑器实例
May 05 Python
详解Python pygame安装过程笔记
Jun 05 Python
Jupyter中直接显示Matplotlib的图形方法
May 24 Python
解决Django的request.POST获取不到内容的问题
May 28 Python
Python内存读写操作示例
Jul 18 Python
python字符串循环左移
Mar 08 Python
Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】
Mar 18 Python
Python格式化字符串f-string概览(小结)
Jun 18 Python
python如果快速判断数字奇数偶数
Nov 13 Python
Django 路由层URLconf的实现
Dec 30 Python
Python selenium抓取虎牙短视频代码实例
Mar 02 Python
Python3利用openpyxl读写Excel文件的方法实例
Feb 03 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
Mar 04 #Python
Python 调用C++封装的进一步探索交流
Mar 04 #Python
使用Python webdriver图书馆抢座自动预约的正确方法
Mar 04 #Python
Python与C/C++的相互调用案例
Mar 04 #Python
解决Python import .pyd 可能遇到路径的问题
Mar 04 #Python
关于PySnooper 永远不要使用print进行调试的问题
Mar 04 #Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
Mar 04 #Python
You might like
php session应用实例 登录验证
2009/03/16 PHP
PHP设计模式之结构模式的深入解析
2013/06/13 PHP
window.open被浏览器拦截后的自定义提示效果代码
2007/11/19 Javascript
用js实现的页面关键字密度查询代码
2007/12/27 Javascript
JSON 学习之JSON in JavaScript详细使用说明
2010/02/23 Javascript
javascript jscroll模拟html元素滚动条
2012/12/18 Javascript
编写js扩展方法判断一个数组中是否包含某个元素
2013/11/08 Javascript
JavaScript中数组去除重复的三种方法
2016/04/22 Javascript
JavaScript 链式结构序列化详解
2016/09/30 Javascript
JS实现电商放大镜效果
2017/08/24 Javascript
Easy UI动态树点击文字实现展开关闭功能
2017/09/30 Javascript
js+canvas实现滑动拼图验证码功能
2018/03/26 Javascript
Vue匿名插槽与作用域插槽的合并和覆盖行为
2019/04/22 Javascript
vue history 模式打包部署在域名的二级目录的配置指南
2019/07/02 Javascript
解决layui数据表格排序图标被超出的表头挤出去的问题
2019/09/19 Javascript
Vue实现简单的跑马灯
2020/05/25 Javascript
[03:01]DOTA2英雄基础教程 露娜
2014/01/07 DOTA
[40:55]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#4Newbee VS Fnatic
2016/03/03 DOTA
Python中使用 Selenium 实现网页截图实例
2014/07/18 Python
Python列表append和+的区别浅析
2015/02/02 Python
Python利用Nagios增加微信报警通知的功能
2016/02/18 Python
你应该知道的python列表去重方法
2017/01/17 Python
基于Python列表解析(列表推导式)
2018/06/23 Python
python判断一个数是否能被另一个整数整除的实例
2018/12/12 Python
pycharm中显示CSS提示的知识点总结
2019/07/29 Python
pandas DataFrame的修改方法(值、列、索引)
2019/08/02 Python
Pytorch使用MNIST数据集实现基础GAN和DCGAN详解
2020/01/10 Python
Topshop法国官网:英国快速时尚品牌
2018/04/08 全球购物
结婚邀请函范文
2014/01/14 职场文书
房屋委托书范本
2014/04/04 职场文书
《花瓣飘香》教学反思
2014/04/15 职场文书
党员弘扬焦裕禄精神思想汇报
2014/09/10 职场文书
2015年社区党务工作总结
2015/04/21 职场文书
大学生学习十八届五中全会精神心得体会
2016/01/05 职场文书
创业计划书之宠物店
2019/09/19 职场文书
Windows下载并安装MySQL8.0.x 版本的完整教程
2022/04/10 MySQL