django 多数据库配置教程
在django项目中,一个工程中存在多个APP应用很常见.有时候希望不同的APP连接不同的数据库,这个时候需要建立多个数据库连接。
1.修改项目的settings配置
在settings.py中配置需要连接的多个数据库连接串
DATABASES={ 'default':{ 'ENGINE':'django.db.backends.sqlite3', 'NAME':os.path.join(BASE_DIR,'sqlite3'), }, 'db01':{ 'ENGINE':'django.db.backends.sqlite3', 'NAME':os.path.join(BASE_DIR,'db_01'), }, 'db02':{ 'ENGINE':'django.db.backends.sqlite3', 'NAME':os.path.join(BASE_DIR,'db_02'), }, }
假设现在我们用到3个数据库,一个default默认库,一个db01和db02
2.设置数据库的路由规则方法
在settings.py中配置DATABASE_ROUTERS
DATABASE_ROUTERS=['Prject.database_router.DatabaseAppsRouter']
Project:建立的django项目名称(project_name)
database_router:定义路由规则database_router.py文件名称,这个文件名可以自己定义
DatabaseAppsRouter:路由规则的类名称,这个类是在database_router.py文件中定义
3.设置APP对应的数据库路由表
每个APP要连接哪个数据库,需要在做匹配设置,在settings.py文件中做如下配置:
DATABASE_APPS_MAPPING={ #example: #'app_name':'database_name', 'app02':'db02', 'app01':'db01', 'admin':'db01', 'auth':'db01', 'contenttypes':'db01', 'sessions':'db01', }
以上的app01,app02是项目中的APP名,分别指定到db01,db02的数据库。
为了使django自己的表也创建到你自己定义的数据库中,你可以指定:admin,auth,contenttypes,sessions到设定的数据库中,如果不指定则会自动创建到默认(default)的数据库中
4.创建数据库路由规则
在项目工程根路径下(与settings.py文件一级)创建database_router.py文件:
fromdjango.confimportsettings DATABASE_MAPPING=settings.DATABASE_APPS_MAPPING classDatabaseAppsRouter(object): """ Aroutertocontrolalldatabaseoperationsonmodelsfordifferent databases. Incaseanappisnotsetinsettings.DATABASE_APPS_MAPPING,therouter willfallbacktothe`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] returnNone defdb_for_write(self,model,**hints): """Pointallwriteoperationstothespecificdatabase.""" ifmodel._meta.app_labelinDATABASE_MAPPING: returnDATABASE_MAPPING[model._meta.app_label] returnNone defallow_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: returnTrue else: returnFalse returnNone defallow_syncdb(self,db,model): """Makesurethatappsonlyappearintherelateddatabase.""" ifdbinDATABASE_MAPPING.values(): returnDATABASE_MAPPING.get(model._meta.app_label)==db elifmodel._meta.app_labelinDATABASE_MAPPING: returnFalse returnNone defallow_migrate(self,db,app_label,model=None,**hints): """ Makesuretheauthapponlyappearsinthe'auth_db' database. """ ifdbinDATABASE_MAPPING.values(): returnDATABASE_MAPPING.get(app_label)==db elifapp_labelinDATABASE_MAPPING: returnFalse returnNone
5.Models创建样例
在各自的APP中创建数据表的models时,必须要指定表的app_label名字,如果不指定则会创建到default中配置的数据库名下,
如下:
在app01下创建models
classUsers(models.Model): name=models.CharField(max_length=50) passwd=models.CharField(max_length=100) def__str__(self): return"app01%s"%self.name classMeta: app_label="app01"
在app02下创建models
classUsers(models.Model): username=models.CharField(max_length=100) password=models.CharField(max_length=50) age=models.IntegerField() def__str__(self): return"app02%s"%self.username classMeta: app_label="app02" classBook(models.Model): user=models.ForeignKey("Users",on_delete=models.CASCADE) bookname=models.CharField(max_length=100) def__str__(self): return"%s:%s"%(self.user.username,self.bookname) classMeta: app_label="app02"
在app03创建models未指定app_label,创建到default下
classUsers(models.Model): username=models.CharField(max_length=100)
6.生成数据表
在使用django的migrate创建生成表的时候,需要加上–database参数,如果不加则将未指定app_label的APP的models中的表创建到default指定的数据库中,如:
将app01下models中的表创建到db01的数据库”db_01”中
./manage.pymigrate--database=db01
将app02下models中的表创建到db02的数据库”db_02”中
./manage.pymigrate--database=db02
将app03下models中的表创建到default的数据库”sqlite3”中
./manage.pymigrate
以上创建完成后,其它所有的创建、查询、删除等操作就和普通一样操作就可以了,无需再使用类似
models.User.objects.using(dbname).all()
这样的方式来操作。
以上这篇django多数据库配置教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。