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实现动态添加类的属性或成员函数的解决方法
Jul 16 Python
opencv python 傅里叶变换的使用
Jul 21 Python
如何使用Python进行OCR识别图片中的文字
Apr 01 Python
python多进程(加入进程池)操作常见案例
Oct 21 Python
django中间键重定向实例方法
Nov 10 Python
Python qrcode 生成一个二维码的实例详解
Feb 12 Python
python使用gdal对shp读取,新建和更新的实例
Mar 10 Python
Python如何根据时间序列数据作图
May 12 Python
Python json格式化打印实现过程解析
Jul 21 Python
Python使用lambda抛出异常实现方法解析
Aug 20 Python
python爬取”顶点小说网“《纯阳剑尊》的示例代码
Oct 16 Python
Jupyter安装链接aconda实现过程图解
Nov 02 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 MYSQL乱码问题,使用SET NAMES utf8校正
2009/11/30 PHP
完美解决令人抓狂的zend studio 7代码提示(content Assist)速度慢的问题
2013/06/20 PHP
Yii2实现上下联动下拉框功能的方法
2016/08/10 PHP
PHP+Ajax实现的博客文章添加类别功能示例
2018/03/29 PHP
jquery监控数据是否变化(修正版)
2011/04/12 Javascript
js 弹出框只弹一次(二次修改之后的)
2013/11/26 Javascript
无闪烁更新网页内容JS实现
2013/12/19 Javascript
document节点对象的获取方式示例介绍
2013/12/24 Javascript
javascript使用switch case实现动态改变超级链接文字及地址
2014/12/16 Javascript
jQuery点击输入框显示验证码图片
2016/05/19 Javascript
javascript中数组和字符串的方法对比
2016/07/20 Javascript
大白话讲解JavaScript的Promise
2017/04/06 Javascript
BootStrap表单控件之文本域textarea
2017/05/23 Javascript
JS+Canvas绘制动态时钟效果
2017/11/10 Javascript
对Vue beforeRouteEnter 的next执行时机详解
2018/08/25 Javascript
使用layer模态框给新页面传值的方法
2019/09/27 Javascript
[02:34]肉山说——泡妞篇
2014/09/16 DOTA
Python实现telnet服务器的方法
2015/07/10 Python
Python实现购物程序思路及代码
2017/07/24 Python
Python对象属性自动更新操作示例
2018/06/15 Python
python实现从本地摄像头和网络摄像头截取图片功能
2019/07/11 Python
Python实现的爬取豆瓣电影信息功能案例
2019/09/15 Python
Pytorch在dataloader类中设置shuffle的随机数种子方式
2020/01/14 Python
基于pytorch padding=SAME的解决方式
2020/02/18 Python
python实现AHP算法的方法实例(层次分析法)
2020/09/09 Python
介绍CSS3使用技巧5个
2009/04/02 HTML / CSS
uniapp+Html5端实现PC端适配
2020/07/15 HTML / CSS
卡西欧B级产品官方网站:Casio Outlet
2018/05/22 全球购物
美国领先的家庭智能音响系统品牌:Sonos
2018/07/20 全球购物
法国最大的在线眼镜店:EasyLunettes
2019/08/26 全球购物
3个CCIE对一个工程师的面试题
2012/05/06 面试题
党的群众路线教育实践活动总结报告
2014/04/28 职场文书
大学生志愿者活动总结
2014/06/27 职场文书
退休欢送会致辞
2015/07/31 职场文书
600字作文之感受大自然
2019/11/27 职场文书
Python实战之用tkinter库做一个鼠标模拟点击器
2021/04/27 Python