作者:雪蝴蝶的诺言forever | 来源:互联网 | 2023-10-10 21:28
Django配置多个数据库 第一种方法(使用默认数据库配置) 第二种方法(不使用默认数据库配置) 两种方法均为:不同APP使用不同数据库
第一种方法(使用默认数据库配置) 准备一个可以跑的通的Django项目
【settings.py操作】打开项目文件夹下的主文件夹中的settings.py 文件,如下图,我的默认数据库设置的是阿里云远程数据库,然后新增一个本地数据库取名“db1 ”
【settings.py操作】添加数据库路由参数
DATABASES_APPS_MAPPING = { 'author' : 'default' , 'zydata' : 'db1' , }
参数名需要和APP应用名一一对应,如下图:
【在主Module文件夹中添加路由文件操作】编写数据库路由文件database_app_router.py (此文件为功能文件,直接复制粘贴即可,详细看第二种方法)
from django. conf import settingsclass DatabaseAppsRouter ( object ) : def db_for_read ( self, model, ** hints) : app_label = model. _meta. app_labelif app_label in settings. DATABASES_APPS_MAPPING: res = settings. DATABASES_APPS_MAPPING[ app_label] return resreturn None def db_for_write ( self, model, ** hints) : app_label = model. _meta. app_labelif app_label in settings. DATABASES_APPS_MAPPING: return settings. DATABASES_APPS_MAPPING[ app_label] return None def allow_relation ( self, obj1, obj2, ** hints) : db_obj1 = settings. DATABASES_APPS_MAPPING. get( obj1. _mata. app_label) db_obj2 = settings. DATABASES_APPS_MAPPING. get( obj2. _mata. app_label) if db_obj1 and db_obj2: if db_obj1 == db_obj2: return True else : return False return None def db_for_migrate ( self, db, app_label, model_name= None , ** hints) : if db in settings. DATABASES_APPS_MAPPING. values( ) : return settings. DATABASES_APPS_MAPPING. get( app_label) == dbelif app_label in settings. DATABASES_APPS_MAPPING: return False return None
【settings.py操作】添加指向数据库路由文件的路由变量
DATABASE_ROUTERS = [ 'notedrf.database_app_router.DatabaseAppsRouter' ]
如果还没有MySQL数据库表的话,以上配置结束就可以在各个APP中编辑models.py 中的数据库表结构了。编辑完成后同步数据库,如下:
python manage.py makemigrations python manage.py migrate --database=db1 python manage.py migrate
如果已经存在MySQL数据库表的话,那么只需要对mysql数据库表来反向映射结构到models.py 中即可。例如针对已存在的本地数据库db1 进行反向映射,在Terminal 终端中输入以下命令,将会得到反向映射后的代码,如下:
python manage.py inspectdb --database db1
将代码复制粘贴到对应APP应用下的models.py 中即可
以上过程完成后,就可以在对应APP应用下的视图中引用models 模块了
第二种方法(不使用默认数据库配置) 第二种方法和第一种大致类似,只不过没有使用默认数据库选项和修改了数据库路由文件
【settings.py数据库配置】本次没有使用默认数据库配置,但是default 不可少,需要设置为空,如下图:
【settings.py操作】添加指向数据库路由文件的路由变量,如上图最后一行
#配置数据库的路由 DATABASE_ROUTERS = [‘notedrf.db_setting_router.DatabaseRouter’, ]
【在主Module文件夹中添加路由文件操作】编写数据库路由文件db_setting_router.py
class DatabaseRouter ( object ) : db_author_apps = ( "author" , ) def db_for_read ( self, model, ** hints) : if model. _meta. app_label in self. db_author_apps: return 'db0' if model. _meta. app_label in [ "zydata" , ] : return 'db1' return None def db_for_write ( self, model, ** hints) : if model. _meta. app_label in self. db_author_apps: return 'db0' if model. _meta. app_label in [ "zydata" , ] : return 'db1' return None def allow_migrate ( self, db, app_label, model= None , ** hints) : if app_label in self. db_author_apps: return db == 'db0' if app_label in [ "zydata" ] : return db == 'db1' return None
剩下的编辑数据库、同步数据库即可,具体见第一种方法第5步
以上过程完成后,就可以在对应APP应用下的视图中引用models 模块了