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内置函数的用法实例教程
Sep 08 Python
Python基于pygame模块播放MP3的方法示例
Sep 30 Python
将python图片转为二进制文本的实例
Jan 24 Python
使用matplotlib中scatter方法画散点图
Mar 19 Python
Python 实现交换矩阵的行示例
Jun 26 Python
利用python读取YUV文件 转RGB 8bit/10bit通用
Dec 09 Python
Python @property原理解析和用法实例
Feb 11 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
Feb 17 Python
python 实现在shell窗口中编写print不向屏幕输出
Feb 19 Python
Python解析微信dat文件的方法
Nov 30 Python
详解python的xlwings库读写excel操作总结
Feb 26 Python
pandas中pd.groupby()的用法详解
Jun 16 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过滤危险html代码的函数
2008/07/22 PHP
ThinkPHP控制器详解
2015/07/27 PHP
Yii中实现处理前后台登录的新方法
2015/12/28 PHP
PHP attributes()函数讲解
2019/02/03 PHP
Laravel登录失败次数限制的实现方法
2020/08/26 PHP
javascript中的array数组使用技巧
2010/01/31 Javascript
javascript中xml操作实现代码
2011/11/21 Javascript
ASP.NET jQuery 实例11 通过使用jQuery validation插件简单实现用户登录页面验证功能
2012/02/03 Javascript
httpclient模拟登陆具体实现(使用js设置cookie)
2013/12/11 Javascript
js统计录入文本框中字符的个数并加以限制不超过多少
2014/05/23 Javascript
JQuery插件jcarousellite的参数中文说明
2015/05/11 Javascript
jquery输入数字随机抽奖特效的简单实现代码
2016/06/10 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
2016/11/04 Javascript
js自定义瀑布流布局插件
2017/05/16 Javascript
swiper动态改变滑动内容的实现方法
2018/01/17 Javascript
JavaScript实现拖拽效果
2020/03/16 Javascript
vue 使用微信jssdk,调用微信相册上传图片功能
2020/11/13 Javascript
Python3.x和Python2.x的区别介绍
2013/02/12 Python
python使用PythonMagick将jpg图片转换成ico图片的方法
2015/03/26 Python
Python中比较特别的除法运算和幂运算介绍
2015/04/05 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
2017/04/05 Python
python读取excel表格生成erlang数据
2017/08/26 Python
Python基于回溯法子集树模板解决取物搭配问题实例
2017/09/02 Python
Python numpy 常用函数总结
2017/12/07 Python
pandas 将索引值相加的方法
2018/11/15 Python
python pcm音频添加头转成Wav格式文件的方法
2019/01/09 Python
一篇文章了解Python中常见的序列化操作
2019/06/20 Python
python nmap实现端口扫描器教程
2020/05/28 Python
pycharm实现在虚拟环境中引入别人的项目
2020/03/09 Python
Smilodox官方运动服装店:从运动服到健身配件
2020/08/27 全球购物
网吧最新创业计划书范文
2014/03/27 职场文书
报告会主持词
2014/04/02 职场文书
汽车检测与维修专业求职信
2014/07/04 职场文书
学生个人评语大全
2015/01/04 职场文书
公司客户答谢酒会祝酒词
2015/08/11 职场文书
深入理解Vue的数据响应式
2021/05/15 Vue.js