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的Flask框架应用调用Redis队列数据的方法
Jun 06 Python
Python中is与==判断的区别
Mar 28 Python
Python实现感知器模型、两层神经网络
Dec 19 Python
Python实现替换文件中指定内容的方法
Mar 19 Python
Sanic框架基于类的视图用法示例
Jul 18 Python
Django框架HttpResponse对象用法实例分析
Nov 01 Python
Python3交互式shell ipython3安装及使用详解
Jul 11 Python
浅谈Python 钉钉报警必备知识系统讲解
Aug 17 Python
python爬虫中抓取指数的实例讲解
Dec 01 Python
python+selenium+chrome实现淘宝购物车秒杀自动结算
Jan 07 Python
Python字符串对齐、删除字符串不需要的内容以及格式化打印字符
Jan 23 Python
Python中Matplotlib的点、线形状、颜色以及绘制散点图
Apr 07 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基础教程 php内置函数实例教程
2012/08/21 PHP
PHP实现函数内修改外部变量值的方法示例
2018/12/28 PHP
JavaScript 学习 - 提高篇
2007/02/02 Javascript
Extjs中RowExpander控件的默认展开问题示例探讨
2014/01/24 Javascript
javascript作用域和闭包使用详解
2014/04/25 Javascript
Node.js实现批量去除BOM文件头
2014/12/20 Javascript
JavaScript表单验证完美代码
2017/03/02 Javascript
vue-prop父组件向子组件进行传值的方法
2018/03/01 Javascript
快速解决处理后台返回json数据格式的问题
2018/08/07 Javascript
浅谈webpack4 图片处理汇总
2018/09/12 Javascript
JavaScript展开操作符(Spread operator)详解
2019/07/20 Javascript
[01:15:44]首部DOTA2纪录片今日23时全网上映
2014/03/19 DOTA
[55:23]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python错误处理详解
2014/09/28 Python
Python3实现从文件中读取指定行的方法
2015/05/22 Python
深入理解Django的中间件middleware
2018/03/14 Python
利用pandas读取中文数据集的方法
2018/07/25 Python
python按时间排序目录下的文件实现方法
2018/10/17 Python
python实现简单登陆系统
2018/10/18 Python
python DataFrame 取差集实例
2019/01/30 Python
react+django清除浏览器缓存的几种方法小结
2019/07/17 Python
使用python快速在局域网内搭建http传输文件服务的方法
2019/11/14 Python
40行Python代码实现天气预报和每日鸡汤推送功能
2020/02/27 Python
Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程
2020/03/07 Python
使用css3实现的windows8开机加载动画
2014/12/09 HTML / CSS
澳大利亚领先的在线美容商店:Facial Co
2017/10/22 全球购物
比利时买床:Beter Bed
2017/12/06 全球购物
客户代表实习人员自我鉴定
2013/09/27 职场文书
业务员岗位职责范本
2013/12/15 职场文书
乡下人家教学反思
2014/02/01 职场文书
装修协议书范本
2014/04/21 职场文书
银行进社区活动总结
2014/07/07 职场文书
2014酒店客房部工作总结
2014/12/16 职场文书
幼儿教师辞职信
2015/02/27 职场文书
python中os.path.join()函数实例用法
2021/05/26 Python
mysql外连接与内连接查询的不同之处
2021/06/03 MySQL