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自动重试HTTP连接装饰器
Apr 28 Python
Python中pygame的mouse鼠标事件用法实例
Nov 11 Python
python实现的正则表达式功能入门教程【经典】
Jun 05 Python
Python内建函数之raw_input()与input()代码解析
Oct 26 Python
浅谈Python Opencv中gamma变换的使用详解
Apr 02 Python
python使用PIL实现多张图片垂直合并
Jan 15 Python
详解python数据结构和算法
Apr 18 Python
Django 创建/删除用户的示例代码
Jul 24 Python
Django框架安装方法图文详解
Nov 04 Python
Tensorflow中tf.ConfigProto()的用法详解
Feb 06 Python
Python坐标轴操作及设置代码实例
Jun 04 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
Aug 31 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
ThinkPHP实现动态包含文件的方法
2014/11/29 PHP
php中mysql连接方式PDO使用详解
2015/02/25 PHP
PHP 断点续传实例详解
2017/11/11 PHP
深入浅析安装PhpStorm并激活的步骤详解
2020/09/17 PHP
IE6-IE9不支持table.innerHTML的解决方法分享
2012/09/14 Javascript
node.js中的fs.open方法使用说明
2014/12/17 Javascript
TypeScript具有的几个不同特质
2015/04/07 Javascript
AngularJS 路由详解和简单实例
2016/07/28 Javascript
bootstrap选项卡使用方法解析
2017/01/11 Javascript
Vue数组更新及过滤排序功能
2017/08/10 Javascript
Vue shopCart 组件开发详解
2018/01/26 Javascript
PM2自动部署代码步骤流程总结
2018/12/10 Javascript
简单了解JavaScript中常见的反模式
2019/06/21 Javascript
vue使用showdown并实现代码区域高亮的示例代码
2019/10/17 Javascript
jquery实现进度条状态展示
2020/03/26 jQuery
Vue实现穿梭框效果
2020/09/30 Javascript
vue自定义树状结构图的实现方法
2020/10/18 Javascript
[00:29]2019完美世界全国高校联赛(秋季赛)总决赛海口落幕
2019/12/10 DOTA
编写Python小程序来统计测试脚本的关键字
2016/03/12 Python
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
2017/12/14 Python
python绘制简单折线图代码示例
2017/12/19 Python
Python对接 xray 和微信实现自动告警
2019/09/17 Python
详解Python中的分支和循环结构
2020/02/11 Python
如何基于python对接钉钉并获取access_token
2020/04/21 Python
CSS3动画之流彩文字效果+图片模糊效果+边框伸展效果实现代码合集
2017/08/18 HTML / CSS
利用 CSS3 实现的无缝轮播功能代码
2017/09/25 HTML / CSS
浅谈css3中calc在less编译时被计算的解决办法
2017/12/04 HTML / CSS
日本动漫周边服饰销售网站:Atsuko
2019/12/16 全球购物
俄罗斯运动、健康和美容产品在线商店:Lactomin.ru
2020/07/23 全球购物
后勤岗位职责
2013/11/26 职场文书
欢迎标语大全
2014/06/21 职场文书
幼儿园六一主持词开场白
2015/05/28 职场文书
java如何实现socket连接方法封装
2021/09/25 Java/Android
Mysql如何实现不存在则插入,存在则更新
2022/03/25 MySQL
Java 数据结构七大排序使用分析
2022/04/02 Java/Android
详解Mysq MVCC多版本的并发控制
2022/04/29 MySQL