Django 多数据库联用(看着不错还有源码可以下载)
本文講述在一個(gè) django project 中使用多個(gè)數(shù)據(jù)庫(kù)的方法, 多個(gè)數(shù)據(jù)庫(kù)的聯(lián)用 以及多數(shù)據(jù)庫(kù)時(shí)數(shù)據(jù)導(dǎo)入導(dǎo)出的方法。
直接給出一種簡(jiǎn)單的方法吧,想了解更多的到官方教程,點(diǎn)擊此處
代碼文件下載:project_name.zip(2017年05月01日更新)
1. 每個(gè)app都可以單獨(dú)設(shè)置一個(gè)數(shù)據(jù)庫(kù)
settings.py中有數(shù)據(jù)庫(kù)的相關(guān)設(shè)置,有一個(gè)默認(rèn)的數(shù)據(jù)庫(kù) default,我們可以再加一些其它的,比如:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #?Database #?https://docs.djangoproject.com/en/1.8/ref/settings/#databases DATABASES?=?{ ????'default':?{ ????????'ENGINE':?'django.db.backends.sqlite3', ????????'NAME':?os.path.join(BASE_DIR,?'db.sqlite3'), ????}, ????'db1':?{ ????????'ENGINE':?'django.db.backends.mysql', ????????'NAME':?'dbname1', ????????'USER':?'your_db_user_name', ????????'PASSWORD':?'yourpassword', ????????"HOST":?"localhost", ????}, ????'db2':?{ ????????'ENGINE':?'django.db.backends.mysql', ????????'NAME':?'dbname2', ????????'USER':?'your_db_user_name', ????????'PASSWORD':?'yourpassword', ????????"HOST":?"localhost", ????}, } ? #?use?multi-database?in?django #?add?by?WeizhongTu DATABASE_ROUTERS?=?['project_name.database_router.DatabaseAppsRouter'] DATABASE_APPS_MAPPING?=?{ ????#?example: ????#'app_name':'database_name', ????'app1':?'db1', ????'app2':?'db2', } |
?
在project_name文件夾中存放 database_router.py 文件,內(nèi)容如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | #?-*-?coding:?utf-8?-*- 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?None ? ????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?None ? ????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 ? ????#?for?Django?1.4?-?Django?1.6 ????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 ? ????#?Django?1.7?-?Django?1.11 ????def?allow_migrate(self,?db,?app_label,?model_name=None,?**hints): ????????print?db,?app_label,?model_name,?hints ????????if?db?in?DATABASE_MAPPING.values(): ????????????return?DATABASE_MAPPING.get(app_label)?==?db ????????elif?app_label?in?DATABASE_MAPPING: ????????????return?False ????????return?None |
?
這樣就實(shí)現(xiàn)了指定的 app 使用指定的數(shù)據(jù)庫(kù)了,當(dāng)然你也可以多個(gè)sqlite3一起使用,相當(dāng)于可以給每個(gè)app都可以單獨(dú)設(shè)置一個(gè)數(shù)據(jù)庫(kù)!如果不設(shè)置或者沒(méi)有設(shè)置的app就會(huì)自動(dòng)使用默認(rèn)的數(shù)據(jù)庫(kù)。
2.使用指定的數(shù)據(jù)庫(kù)來(lái)執(zhí)行操作
在查詢的語(yǔ)句后面用 using(dbname) 來(lái)指定要操作的數(shù)據(jù)庫(kù)即可
| 1 2 3 4 5 6 7 | #?查詢 YourModel.objects.using('db1').all()? 或者?YourModel.objects.using('db2').all() ? #?保存?或?刪除 user_obj.save(using='new_users') user_obj.delete(using='legacy_users') |
3.多個(gè)數(shù)據(jù)庫(kù)聯(lián)用時(shí)數(shù)據(jù)導(dǎo)入導(dǎo)出
使用的時(shí)候和一個(gè)數(shù)據(jù)庫(kù)的區(qū)別是:
如果不是defalut(默認(rèn)數(shù)據(jù)庫(kù))要在命令后邊加 --database=數(shù)據(jù)庫(kù)對(duì)應(yīng)的settings.py中的名稱? 如: --database=db1 ?或 --database=db2
數(shù)據(jù)庫(kù)同步(創(chuàng)建表)
| 1 2 3 4 5 6 7 8 | #?Django?1.6及以下版本 python?manage.py?syncdb?#同步默認(rèn)的數(shù)據(jù)庫(kù),和原來(lái)的沒(méi)有區(qū)別 ? #?同步數(shù)據(jù)庫(kù)?db1?(注意:不是數(shù)據(jù)庫(kù)名是db1,是settings.py中的那個(gè)db1,不過(guò)你可以使這兩個(gè)名稱相同,容易使用) python?manage.py?syncdb?--database=db1 ? #?Django?1.7?及以上版本 python?manage.py?migrate?--database=db1 |
數(shù)據(jù)導(dǎo)出
| 1 2 3 | python?manage.py?dumpdata?app1?--database=db1?>?app1_fixture.json python?manage.py?dumpdata?app2?--database=db2?>?app2_fixture.json python?manage.py?dumpdata?auth?>?auth_fixture.json |
數(shù)據(jù)庫(kù)導(dǎo)入
| 1 2 | python?manage.py?loaddata?app1_fixture.json?--database=db1 python?manage.py?loaddata?app2_fixture.json?--database=db2 ? |
?
來(lái)源:https://code.ziqiangxuetang.com/django/django-multi-database.html
總結(jié)
以上是生活随笔為你收集整理的Django 多数据库联用(看着不错还有源码可以下载)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Django中一个项目使用多个数据库(原
- 下一篇: 银行登录密码是什么 开通网银时候银行柜员