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 动态获取当前运行的类名和函数名的方法
Apr 15 Python
Pyhton中防止SQL注入的方法
Feb 05 Python
Python实现的数据结构与算法之快速排序详解
Apr 22 Python
Python实现二叉搜索树
Feb 03 Python
Python实现将文本生成二维码的方法示例
Jul 18 Python
浅谈pycharm的xmx和xms设置方法
Dec 03 Python
使用PIL(Python-Imaging)反转图像的颜色方法
Jan 24 Python
python判断一个对象是否可迭代的例子
Jul 22 Python
基于Python和PyYAML读取yaml配置文件数据
Jan 13 Python
python中字典增加和删除使用方法
Sep 30 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
Oct 09 Python
Django框架中视图的用法
Jun 10 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 APP微信提现接口代码
2018/09/30 PHP
CL vs ForZe BO5 第二场 2.13
2021/03/10 DOTA
JavaScript 动态改变图片大小
2009/06/11 Javascript
jquery控制listbox中项的移动并排序的实现代码
2010/09/28 Javascript
JavaScript中Number.MAX_VALUE属性的使用方法
2015/06/04 Javascript
基于JavaScript FileReader上传图片显示本地链接
2016/05/27 Javascript
Vue.js快速入门实例教程
2016/10/15 Javascript
javascript self对象使用详解
2016/10/18 Javascript
微信小程序开发之实现自定义Toast弹框
2017/06/08 Javascript
详解Angular2表单-模板驱动的表单(Template-Driven Forms)
2017/08/04 Javascript
Nodejs 复制文件/文件夹的方法
2017/08/24 NodeJs
JS实现简易换图时钟功能分析
2018/01/04 Javascript
vue.js实现只能输入数字的输入框
2019/10/19 Javascript
JS快速实现简单计算器
2020/04/08 Javascript
jquery检测上传文件大小示例
2020/04/26 jQuery
微信小程序手动添加收货地址省市区联动
2020/05/18 Javascript
vue Treeselect 树形下拉框:获取选中节点的ids和lables操作
2020/08/15 Javascript
利用matplotlib+numpy绘制多种绘图的方法实例
2017/05/03 Python
Python探索之pLSA实现代码
2017/10/25 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
2018/07/25 Python
Python3.5局部变量与全局变量作用域实例分析
2019/04/30 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
python中os包的用法
2020/06/01 Python
Flask中sqlalchemy模块的实例用法
2020/08/02 Python
如何以Winsows Service方式运行JupyterLab
2020/08/30 Python
用纯css3实现的图片放大镜特效效果非常不错
2014/09/02 HTML / CSS
从当地商店送来的杂货:Instacart
2018/08/19 全球购物
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
简述数组与指针的区别
2014/01/02 面试题
注塑工厂厂长岗位职责
2013/12/02 职场文书
春节晚会主持词
2014/03/24 职场文书
团日活动总结模板
2014/06/25 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书
2015大学党建带团建工作总结
2015/07/23 职场文书
图书借阅制度范本
2015/08/06 职场文书
2016年万圣节活动总结
2016/04/05 职场文书