Django项目怎么配置连接多个数据库
作者
Django项目怎么配置连接多个数据库
今天小编给大家分享一下Django项目怎么配置连接多个数据库的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
一个APP对应一个默认数据库,若连接其他数据库用".using()"
Author.objects.using('db02').all()
1、在项目settings中增加数据库配置
#settings.pyDATABASES={'default':{'ENGINE':'django.db.backends.oracle','NAME':'orcl19c','USER':"username01",'PASSWORD':"password01",'HOST':"110.10.1.11",'PORT':1511,},'db_2':{'ENGINE':'django.db.backends.oracle','NAME':'orcl19c','USER':"username02",'PASSWORD':"password02",'HOST':"120.20.2.22",'PORT':1512,}}#以下MyProject改成项目名,默认default不用修改DATABASE_ROUTERS=['MyProject.database_router.DatabaseAppsRouter']DATABASE_APPS_MAPPING={'app01':'default','app02':'db_2',}
2、在项目根目录下Myproject/Myproject 新建数据库路由文件database_router.py
直接复制以下代码,无需修改
fromdjango.confimportsettingsDATABASE_MAPPING=settings.DATABASE_APPS_MAPPINGclassDatabaseAppsRouter(object):"""Aroutertocontrolalldatabaseoperationsonmodelsfordifferentdatabases.Incaseanappisnotsetinsettings.DATABASE_APPS_MAPPING,therouterwillfallbacktothe`default`database.Settingsexample:DATABASE_APPS_MAPPING={'app1':'db1','app2':'db2'}"""defdb_for_read(self,model,**hints):""""Pointallreadoperationstothespecificdatabase."""ifmodel._meta.app_labelinDATABASE_MAPPING:returnDATABASE_MAPPING[model._meta.app_label]returnNonedefdb_for_write(self,model,**hints):"""Pointallwriteoperationstothespecificdatabase."""ifmodel._meta.app_labelinDATABASE_MAPPING:returnDATABASE_MAPPING[model._meta.app_label]returnNonedefallow_relation(self,obj1,obj2,**hints):"""Allowanyrelationbetweenappsthatusethesamedatabase."""db_obj1=DATABASE_MAPPING.get(obj1._meta.app_label)db_obj2=DATABASE_MAPPING.get(obj2._meta.app_label)ifdb_obj1anddb_obj2:ifdb_obj1==db_obj2:returnTrueelse:returnFalsereturnNonedefallow_syncdb(self,db,model):"""Makesurethatappsonlyappearintherelateddatabase."""ifdbinDATABASE_MAPPING.values():returnDATABASE_MAPPING.get(model._meta.app_label)==dbelifmodel._meta.app_labelinDATABASE_MAPPING:returnFalsereturnNonedefallow_migrate(self,db,app_label,model=None,**hints):"""Makesuretheauthapponlyappearsinthe'auth_db'database."""ifdbinDATABASE_MAPPING.values():returnDATABASE_MAPPING.get(app_label)==dbelifapp_labelinDATABASE_MAPPING:returnFalsereturnNone
3、使用inspectdb反向生成各app的model类之后,配置model类对应要链接的数据库
反向生成models.py 命令:
pythonmanage.pyinspectdb--databasedb1TableName1>app01/models.pypythonmanage.pyinspectdb--databasedb2TableName2>app02/models.py
#编辑app01下的models.py:classNames(models.Model):#该model使用default数据库id=models.CharField(primary_key=True,max_length=100,blank=True,null=True)name=models.CharField(max_length=32,primary_key=True,unique=True)classMeta:#app_label='app01'#由于该model连接default数据库,所以在此无需指定db_table='names'#编辑app02下的models.py:classClassnum(models.Model):#该model使用default数据库id=models.CharField(primary_key=True,max_length=100,blank=True,null=True)classnum=models.CharField(max_length=32,primary_key=True,unique=True)classMeta:app_label='app02'db_table='classnum'
4、同步数据库
#同步default节点数据库,只运行不带--database参数的命令,不对其他数据库进行同步pythonmanage.pymakemigrationspythonmanage.pymigrate#同步db02节点数据库:pythonmanage.pymakemigrationspythonmanage.pymigrate--database=db02
5、若要连接配置外的数据库
Author.objects.using('other').all()my_object.save(using='legacy_users')my_object.delete(using='legacy_users')
移动对象到另一个数据库时会发生主键冲突,可以使用obj.pk方法清除主键再保存对象
>>>p=Person(name='Fred')>>>p.save(using='first')>>>p.pk=None#Cleartheprimarykey.>>>p.save(using='second')#Writea
以上就是“Django项目怎么配置连接多个数据库”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注恰卡编程网行业资讯频道。
目录
推荐阅读
0 条评论
本站已关闭游客评论,请登录或者注册后再评论吧~