• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    django使用多个数据库的方法实例

    通过官方文档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 ForeignKey与数据库的FOREIGN KEY约束详解
    • pycharm中django框架连接mysql数据库的方法
    • django inspectdb 操作已有数据库数据的使用步骤
    • Python web框架(django,flask)实现mysql数据库读写分离的示例
    • Django连接本地mysql数据库(pycharm)的步骤
    • django 解决model中类写不到数据库中,数据库无此字段的问题
    • Python的Django框架实现数据库查询(不返回QuerySet的方法)
    • django 数据库返回queryset实现封装为字典
    • Django项目如何给数据库添加约束
    上一篇:Python使用paramiko连接远程服务器执行Shell命令的实现
    下一篇:Python 求向量的余弦值操作
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    django使用多个数据库的方法实例 django,使用,多个,数据库,