定義資料庫 在Django中使用多個資料庫的第一步是告訴Django您將要使用的資料庫伺服器。 資料庫可以有您選擇的任何別名。但是,別名 default 有著特殊的意義。Django使用別名為 default 為預設資料庫。 例如 settings.py 定義兩個資料庫,預設 PostgreSQL ...
定義資料庫
在Django中使用多個資料庫的第一步是告訴Django您將要使用的資料庫伺服器。
資料庫可以有您選擇的任何別名。但是,別名 default
有著特殊的意義。Django使用別名為 default
為預設資料庫。
例如 settings.py
定義兩個資料庫,預設 PostgreSQL 資料庫和名為 users 的 MySQL 資料庫:
DATABASES = { 'default': { 'NAME': 'app_data', 'ENGINE': 'django.db.backends.postgresql', 'USER': 'postgres_user', 'PASSWORD': 's3krit' }, 'users': { 'NAME': 'user_data', 'ENGINE': 'django.db.backends.mysql', 'USER': 'mysql_user', 'PASSWORD': 'priv4te' } }View Code
下麵示例 settings.py
定義兩個非預設資料庫,並將 default 資料庫
故意空著:
DATABASES = { 'default': {}, 'users': { 'NAME': 'user_data', 'ENGINE': 'django.db.backends.mysql', 'USER': 'mysql_user', 'PASSWORD': 'superS3cret' }, 'customers': { 'NAME': 'customer_data', 'ENGINE': 'django.db.backends.mysql', 'USER': 'mysql_cust', 'PASSWORD': 'veryPriv@ate' } }View Code
同步資料庫
#預設情況下使用 default 資料庫, 在 default 資料庫為空時不指定資料庫會報錯 python manage.py migrate #要使用特定的資料庫, 就需要指定資料庫 python manage.py migrate --database=usersView Code
手動選擇資料庫
在查詢時可以調用 using() 手動選擇資料庫。
using() 接受一個參數要在其上運行查詢的資料庫的別名。例如:
>>> # 這將運行 'default' 資料庫.
>>> Author.objects.all()
>>> # 這個和上面也是一樣的效果.
>>> Author.objects.using('default').all()
>>> # 這個就會運行指定的 'other' 資料庫.
>>> Author.objects.using('other').all()
View Code
若要將數據保存到指定的資料庫;例如,若要將對象保存到 legacy_users
資料庫,您可以使用這個:
my_object.save(using='legacy_users')
如果不指定using
,save()
方法將保存到由路由器分配的預設資料庫中。
將對象從一個資料庫移到另一個資料庫
如果您已將實例保存到一個資料庫,再使用 save(using=...)
作為將實例遷移到新資料庫。如果您不採取適當的步驟,這可能會產生一些意想不到的後果。
p = Person(name='Fred')
p.save(using='first')
p.save(using='second')
Person
對象保存到first
資料庫時,p
沒有主鍵,因此Django發出SQLINSERT
聲明。這將創建一個主鍵,Django將主鍵分配給p;
當保存到 'second' 資料庫上時,
p
已經有一個主鍵值,Django將嘗試在新資料庫中使用該主鍵。如果second
資料庫沒有該主鍵值,那麼就不會有任何問題,對象將被覆制到新的資料庫。但是,如果p的主鍵
在second
資料庫中有對應的數據時,對應數據將被重寫。
可以通過兩種方式避免這種情況。首先,可以清除實例的主鍵:
p = Person(name='Fred')
p.save(using='first')
p.pk = None # 清除p的主鍵值
p.save(using='second') # 寫入一個沒有主鍵的p實例
或者使用force_insert來save(),
以確保Django執行SQLINSERT
:
p = Person(name='Fred')
p.save(using='first')
p.save(using='second', force_insert=True)
選擇要刪除的資料庫
預設刪除實例對象作用的資料庫
u = User.objects.using('legacy_users').get(username='fred')
u.delete() #從 'legacy_users' 資料庫中刪除 'fred'
若要刪除指定資料庫的數據,傳遞 using 關鍵字,和 save() 類似。
例如,如果要把一個 user 從 legacy_users
資料庫遷移到 new_users
資料庫中,可以使用以下命令:
user_obj.save(using='new_users')
user_obj.delete(using='legacy_users')#刪除指定資料庫的數據
學習自用,歡迎大神評論、指正
詳情見Django文檔:
https://docs.djangoproject.com/en/2.1/topics/db/multi-db/