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创建只读属性对象的方法(ReadOnlyObject)
Feb 10 Python
Python深入学习之对象的属性
Aug 31 Python
python使用线程封装的一个简单定时器类实例
May 16 Python
Django中redis的使用方法(包括安装、配置、启动)
Feb 21 Python
matlab中实现矩阵删除一行或一列的方法
Apr 04 Python
python学生信息管理系统(初级版)
Oct 17 Python
Python字典遍历操作实例小结
Mar 05 Python
了解不常见但是实用的Python技巧
May 23 Python
python属于跨平台语言码
Jun 09 Python
Python 存取npy格式数据实例
Jul 01 Python
浅谈Python中的正则表达式
Jun 28 Python
Python+tkinter实现高清图片保存
Mar 13 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
Windows 下的 PHP-PEAR 安装方法
2010/11/20 PHP
php批量缩放图片的代码[ini参数控制]
2011/02/11 PHP
ThinkPHP模板中数组循环实例
2014/10/30 PHP
php表单提交实例讲解
2015/11/12 PHP
PHP数学运算与数据处理实例分析
2016/04/01 PHP
激活 ActiveX 控件
2006/10/09 Javascript
Javascript & DHTML 实例编程(教程)基础知识
2007/06/02 Javascript
表单元素事件 (Form Element Events)
2009/07/17 Javascript
javascript 进阶篇3 Ajax 、JSON、 Prototype介绍
2012/03/14 Javascript
javascript全局变量封装模块实现代码
2012/11/28 Javascript
Jquery图片滚动与幻灯片的实例代码
2013/04/08 Javascript
JavaScript加强之自定义event事件
2013/09/21 Javascript
获取当前点击按钮的id用this.id实现
2014/03/17 Javascript
判断浏览器的内核及版本号方法汇总
2015/01/05 Javascript
深入分析Cookie的安全性问题
2015/03/01 Javascript
Node.js程序中的本地文件操作用法小结
2016/03/06 Javascript
Javascript函数中的arguments.callee用法实例分析
2016/09/16 Javascript
微信小程序 教程之wxapp 视图容器 view
2016/10/19 Javascript
Angularjs+bootstrap+table多选(全选)支持单击行选中实现编辑、删除功能
2017/03/27 Javascript
webpack教程之webpack.config.js配置文件
2017/07/05 Javascript
JS实现的数组去除重复数据算法小结
2017/11/17 Javascript
node.js中fs文件系统目录操作与文件信息操作
2018/02/24 Javascript
vue自定义指令directive的使用方法
2019/04/07 Javascript
Vue 样式切换及三元判断样式关联操作
2020/08/09 Javascript
python 调用win32pai 操作cmd的方法
2017/05/28 Python
linux环境下的python安装过程图解(含setuptools)
2017/11/22 Python
python爬虫URL重试机制的实现方法(python2.7以及python3.5)
2018/12/18 Python
python使用phoenixdb操作hbase的方法示例
2019/02/28 Python
如何获得EntityManager
2014/02/09 面试题
大唐面试试题(CPU,UNIX等等)
2012/01/11 面试题
满月酒答谢词
2014/01/14 职场文书
骨干教师申报材料
2014/12/17 职场文书
阿甘正传观后感
2015/06/01 职场文书
活动宣传稿范文
2015/07/23 职场文书
python numpy中setdiff1d的用法说明
2021/04/22 Python
Sleuth+logback 设置traceid 及自定义信息方式
2021/07/26 Java/Android