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 相关文章推荐
使用FastCGI部署Python的Django应用的教程
Jul 22 Python
Python中表示字符串的三种方法
Sep 06 Python
让Django支持Sql Server作后端数据库的方法
May 29 Python
python3 中文乱码与默认编码格式设定方法
Oct 31 Python
Python3.5迭代器与生成器用法实例分析
Apr 30 Python
pandas DataFrame 行列索引及值的获取的方法
Jul 02 Python
Python求离散序列导数的示例
Jul 10 Python
Python 使用指定的网卡发送HTTP请求的实例
Aug 21 Python
python实现按关键字筛选日志文件
Dec 24 Python
django 链接多个数据库 并使用原生sql实现
Mar 28 Python
Python实现从N个数中找到最大的K个数
Apr 02 Python
python 如何上传包到pypi
Dec 24 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中关于抽象(abstract)类和抽象方法的问题分析
2014/01/03 PHP
ThinkPHP视图查询详解
2014/06/30 PHP
Yii使用技巧大汇总
2015/12/29 PHP
Zend Framework连接Mysql数据库实例分析
2016/03/19 PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
2018/12/05 PHP
ThinkPHP3.2框架自带分页功能实现方法示例
2019/05/13 PHP
YII2框架中actions的作用与使用方法示例
2020/03/13 PHP
Prototype ObjectRange对象学习
2009/07/19 Javascript
jQuery 学习第六课 实现一个Ajax的TreeView
2010/05/17 Javascript
JQuery.closest(),parent(),parents()寻找父结点
2012/02/17 Javascript
简介JavaScript中的italics()方法的使用
2015/06/08 Javascript
原生js配合cookie制作保存路径的拖拽
2015/12/29 Javascript
浅析Bootstrap组件之面板组件
2016/05/04 Javascript
Angular2入门--架构总览
2017/03/29 Javascript
VUE使用vuex解决模块间传值问题的方法
2017/06/01 Javascript
AngularJS实用基础知识_入门必备篇(推荐)
2017/07/10 Javascript
jQuery结合jQuery.cookie.js插件实现换肤功能示例
2017/10/14 jQuery
用Node提供静态文件服务的方法
2018/07/06 Javascript
H5+C3+JS实现双人对战五子棋游戏(UI篇)
2020/05/28 Javascript
vue 双向数据绑定的实现学习之监听器的实现方法
2018/11/30 Javascript
layer弹出框确定前验证:弹出消息框的方法(弹出两个layer)
2019/09/21 Javascript
js实现中文实时时钟
2020/01/15 Javascript
Python使用BeautifulSoup库解析HTML基本使用教程
2016/03/31 Python
win10系统下Anaconda3安装配置方法图文教程
2018/09/19 Python
python图像处理入门(一)
2019/04/04 Python
详解Python 定时框架 Apscheduler原理及安装过程
2019/06/14 Python
Django实现内容缓存实例方法
2020/06/30 Python
Python lxml库的简单介绍及基本使用讲解
2020/12/22 Python
BONIA波尼亚新加坡官网:皮革手袋,鞋类和配件
2016/08/25 全球购物
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
仓库规划计划书
2014/04/28 职场文书
2014年教师节寄语
2014/08/11 职场文书
2016年毕业实习心得体会范文
2015/10/09 职场文书
css3中2D转换之有趣的transform形变效果
2022/02/24 HTML / CSS
《吸血鬼幸存者》新内容发布 追加多个全新模式
2022/04/07 其他游戏
MySQL的意向共享锁、意向排它锁和死锁
2022/07/15 MySQL