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多数据库内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

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

郑重声明:本网站发布的内容(图片、视频和文字)以及用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服