Django 多数据库联用(看着不错还有源码可以下载)
本文講述在一個 django project 中使用多個數據庫的方法, 多個數據庫的聯用 以及多數據庫時數據導入導出的方法。
直接給出一種簡單的方法吧,想了解更多的到官方教程,點擊此處
代碼文件下載:project_name.zip(2017年05月01日更新)
1. 每個app都可以單獨設置一個數據庫
settings.py中有數據庫的相關設置,有一個默認的數據庫 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 文件,內容如下:
| 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 |
?
這樣就實現了指定的 app 使用指定的數據庫了,當然你也可以多個sqlite3一起使用,相當于可以給每個app都可以單獨設置一個數據庫!如果不設置或者沒有設置的app就會自動使用默認的數據庫。
2.使用指定的數據庫來執行操作
在查詢的語句后面用 using(dbname) 來指定要操作的數據庫即可
| 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.多個數據庫聯用時數據導入導出
使用的時候和一個數據庫的區別是:
如果不是defalut(默認數據庫)要在命令后邊加 --database=數據庫對應的settings.py中的名稱? 如: --database=db1 ?或 --database=db2
數據庫同步(創建表)
| 1 2 3 4 5 6 7 8 | #?Django?1.6及以下版本 python?manage.py?syncdb?#同步默認的數據庫,和原來的沒有區別 ? #?同步數據庫?db1?(注意:不是數據庫名是db1,是settings.py中的那個db1,不過你可以使這兩個名稱相同,容易使用) python?manage.py?syncdb?--database=db1 ? #?Django?1.7?及以上版本 python?manage.py?migrate?--database=db1 |
數據導出
| 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 |
數據庫導入
| 1 2 | python?manage.py?loaddata?app1_fixture.json?--database=db1 python?manage.py?loaddata?app2_fixture.json?--database=db2 ? |
?
來源:https://code.ziqiangxuetang.com/django/django-multi-database.html
總結
以上是生活随笔為你收集整理的Django 多数据库联用(看着不错还有源码可以下载)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django中一个项目使用多个数据库(原
- 下一篇: 银行登录密码是什么 开通网银时候银行柜员