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多线程编程(七):使用Condition实现复杂同步
Apr 05 Python
python实现的系统实用log类实例
Jun 30 Python
python实现list元素按关键字相加减的方法示例
Jun 09 Python
对python list 遍历删除的正确方法详解
Jun 29 Python
python获取指定字符串中重复模式最高的字符串方法
Jun 29 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
Aug 10 Python
Python logging模块用法示例
Aug 28 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
Apr 01 Python
Python脚本导出为exe程序的方法
Mar 25 Python
Python基于BeautifulSoup爬取京东商品信息
Jun 01 Python
python使用matplotlib绘制折线图的示例代码
Sep 22 Python
python 绘制国旗的示例
Sep 27 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中判断一个请求是ajax请求还是普通请求的方法
2011/06/28 PHP
PHP 处理TXT文件(打开/关闭/检查/读取)
2013/05/13 PHP
分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)
2014/01/30 PHP
javascript将数组插入到另一个数组中的代码
2013/01/10 Javascript
jQuery调用ajax请求的常见方法汇总
2015/03/24 Javascript
基于Jquery制作图片文字排版预览效果附源码下载
2015/11/18 Javascript
Web 开发中Ajax的Session 超时处理方法
2017/01/19 Javascript
浅谈js中同名函数和同名变量的执行问题
2017/02/12 Javascript
详解webpack es6 to es5支持配置
2017/05/04 Javascript
浅谈vue中使用图片懒加载vue-lazyload插件详细指南
2017/10/23 Javascript
实例教学如何写vue插件
2017/11/30 Javascript
解决vue keep-alive 数据更新的问题
2018/09/21 Javascript
layui的layedit富文本赋值方法
2019/09/18 Javascript
[02:42]DOTA2城市挑战赛收官在即 四强之争风起云涌
2018/06/05 DOTA
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
2016/10/12 Python
如何在python字符串中输入纯粹的{}
2018/08/22 Python
Flask框架踩坑之ajax跨域请求实现
2019/02/22 Python
pyqt5 实现工具栏文字图片同时显示
2019/06/13 Python
python实现截取屏幕保存文件,删除N天前截图的例子
2019/08/27 Python
在pandas中遍历DataFrame行的实现方法
2019/10/23 Python
python字典和json.dumps()的遇到的坑分析
2020/03/11 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
2020/06/01 Python
用python绘制樱花树
2020/10/09 Python
python定时截屏实现
2020/11/02 Python
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
KIKO MILANO英国官网:意大利知名化妆品和护肤品品牌
2017/09/25 全球购物
印尼美容产品购物网站:PerfectBeauty.id
2017/12/01 全球购物
美国木工工具和用品商店:Woodcraft
2019/10/30 全球购物
小学教师的自我评价范例
2013/10/31 职场文书
工作自荐信
2013/12/11 职场文书
小学端午节活动方案
2014/03/13 职场文书
2014年精神文明建设工作总结
2014/11/19 职场文书
指导教师推荐意见
2015/06/05 职场文书
青年干部培训班学习心得体会
2016/01/06 职场文书
MySQL索引篇之千万级数据实战测试
2021/04/05 MySQL
Win10防火墙白名单怎么设置?Win10添加防火墙白名单方法
2022/04/06 数码科技