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使用PIL缩放网络图片并保存的方法
Apr 24 Python
深入了解Python数据类型之列表
Jun 24 Python
python list删除元素时要注意的坑点分享
Apr 18 Python
Python实现对特定列表进行从小到大排序操作示例
Feb 11 Python
python验证身份证信息实例代码
May 06 Python
python爬虫解决验证码的思路及示例
Aug 01 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
Oct 09 Python
如何利用python web框架做文件流下载的实现示例
Jun 02 Python
python如何删除列为空的行
Jul 17 Python
python实现学生信息管理系统(精简版)
Nov 27 Python
用python查找统一局域网下ip对应的mac地址
Jan 13 Python
Django路由层如何获取正确的url
Jul 15 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
新版mysql+apache+php Linux安装指南
2006/10/09 PHP
利用PHP将部分内容用星号替换
2020/04/21 PHP
php-fpm添加service服务的例子
2018/04/27 PHP
设置下载不需要倒计时cookie(倒计时代码)
2008/11/19 Javascript
用js实现计算加载页面所用的时间
2010/04/02 Javascript
在线一元二次方程计算器实例(方程计算器在线计算)
2013/12/22 Javascript
微信小程序 页面跳转如何实现传值
2017/04/05 Javascript
Javascript之图片的延迟加载的实例详解
2017/07/24 Javascript
前端主流框架vue学习笔记第一篇
2017/07/26 Javascript
详解vue 模拟后台数据(加载本地json文件)调试
2017/08/25 Javascript
vue.js路由跳转详解
2017/08/28 Javascript
详细介绍RxJS在Angular中的应用
2017/09/23 Javascript
浅谈vuex 闲置状态重置方案
2018/01/04 Javascript
vue 实现全选全不选的示例代码
2018/03/29 Javascript
Vue.set()动态的新增与修改数据,触发视图更新的方法
2018/09/15 Javascript
AngularJS 监听变量变化的实现方法
2018/10/09 Javascript
Smartour 让网页导览变得更简单(推荐)
2019/07/19 Javascript
详解Vue-cli3.X使用px2rem遇到的问题
2019/08/09 Javascript
JavaScript实现切换多张图片
2021/01/27 Javascript
Python selenium抓取微博内容的示例代码
2018/05/17 Python
分享Python切分字符串的一个不错方法
2018/12/14 Python
详解numpy的argmax的具体使用
2019/05/27 Python
TensorFlow基于MNIST数据集实现车牌识别(初步演示版)
2019/08/05 Python
Django获取应用下的所有models的例子
2019/08/30 Python
CSS3中的content属性使用示例
2015/07/20 HTML / CSS
Rockport乐步美国官网:风靡美国的白宫鞋
2016/11/24 全球购物
Book Depository美国:全球领先的专业网上书店之一
2019/08/14 全球购物
党员的自我评价范文
2014/01/02 职场文书
大学生村官工作感言
2014/01/10 职场文书
决定成败的关键——创业计划书
2014/01/24 职场文书
教师产假请假条范文
2014/04/10 职场文书
财务管理专业自荐书
2014/09/02 职场文书
行政执法作风整顿剖析材料
2014/10/11 职场文书
投资入股合作协议书
2014/10/28 职场文书
社会实践活动总结
2015/02/05 职场文书
2015年监理个人工作总结
2015/05/23 职场文书