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轻松实现代码编码格式转换
Mar 26 Python
使用Python的内建模块collections的教程
Apr 28 Python
详解Python中break语句的用法
May 14 Python
python获取局域网占带宽最大3个ip的方法
Jul 09 Python
Python中将字典转换为列表的方法
Sep 21 Python
python机器学习实战之K均值聚类
Dec 20 Python
Flask模拟实现CSRF攻击的方法
Jul 24 Python
python itchat给指定联系人发消息的方法
Jun 11 Python
Python closure闭包解释及其注意点详解
Aug 28 Python
python 实现字符串下标的输出功能
Feb 13 Python
在python中使用nohup命令说明
Apr 16 Python
python矩阵运算,转置,逆运算,共轭矩阵实例
May 11 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
二次元帅气男生排行榜,只想悄悄收藏系列
2020/03/04 日漫
PHP控制网页过期时间的代码
2008/09/28 PHP
php常见的魔术方法详解
2014/12/25 PHP
Codeigniter的dom类用法实例
2015/06/26 PHP
PHP截取IE浏览器并缩小原图的方法
2016/03/04 PHP
php中钩子(hook)的原理与简单应用demo示例
2019/09/03 PHP
javascript之dhDataGrid Ver2.0.0代码
2007/07/01 Javascript
添加JavaScript重载函数的辅助方法2
2010/07/04 Javascript
基于jquery的图片轮播 tab切换组件
2012/07/19 Javascript
js实现两个值相加alert出来精确到指定位
2013/09/25 Javascript
浅析js预加载/延迟加载
2014/09/25 Javascript
在浏览器中打开或关闭JavaScript的方法
2015/06/03 Javascript
javascript学习笔记之函数定义
2015/06/25 Javascript
jquery可定制的在线UEditor编辑器
2015/11/17 Javascript
JavaScript拖拽、碰撞、重力及弹性运动实例分析
2016/01/08 Javascript
如何在vue中使用ts的示例代码
2018/02/28 Javascript
在小程序中集成redux/immutable/thunk第三方库的方法
2018/08/12 Javascript
vue项目实现表单登录页保存账号和密码到cookie功能
2018/08/31 Javascript
js实现删除json中指定的元素
2020/09/22 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
python快速查找算法应用实例
2014/09/26 Python
Python中创建字典的几种方法总结(推荐)
2017/04/27 Python
Python使用Tkinter实现机器人走迷宫
2018/01/22 Python
pytorch 把MNIST数据集转换成图片和txt的方法
2018/05/20 Python
分析python请求数据
2018/08/19 Python
浅谈python requests 的put, post 请求参数的问题
2019/01/02 Python
Python安装OpenCV的示例代码
2020/03/05 Python
Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)
2020/06/23 Python
Java中的基本数据类型所占存储空间大小固定的吗
2012/02/15 面试题
信息学院毕业生自荐信范文
2014/03/04 职场文书
法人任命书范本
2014/06/04 职场文书
关于十八大的演讲稿
2014/09/15 职场文书
2016中秋晚会开幕词
2016/03/03 职场文书
MySql 8.0及对应驱动包匹配的注意点说明
2021/06/23 MySQL
zabbix如何添加监控主机和自定义监控项
2022/08/14 Servers