Django 中的多个数据库
Multiple Database in Django
我正在尝试使用 Django 创建一个 Q/A 网站,我想为所有应用程序使用多个数据库
- 两个安全数据库,如 admin、auth、forum
- 其余部分安全性较低(如 sqlite3)的数据库
但我不想重新配置我的模型和应用程序。
我该怎么做?
N.B:论坛是实现Q/A网站的应用程序
我的意思是,您显然需要进行一些重新配置。
大体上,将最常用的数据库设置为默认数据库,将另一个数据库设置为其他数据库 - 这是根据我的一个生产站点的数据库列表改编的。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'databasename',
'USER': 'mydefaultuser',
'PASSWORD': 'novelpassword',
'HOST':'first-host.com',
'PORT':'3306'
},
'auth': {
'ENGINE': 'sqlserver_pymssql',
'HOST': 'myserver.com',
'NAME': 'myauthdatabase',
'PASSWORD': 'passwordhere',
'PORT': 1433,
'USER': 'username'
}}
然后您可以在视图中显式使用其他数据库,使用 using
:
User.objects.using('auth').all()
...或者最好,您可以使用 Database Router:
更广泛地设置它
class AuthRouter(object):
"""
A router to control all database operations on models in the
auth application.
"""
def db_for_read(self, model, **hints):
"""
Attempts to read auth models go to auth_db.
"""
if model._meta.app_label == 'auth':
return 'auth_db'
return None
def db_for_write(self, model, **hints):
"""
Attempts to write auth models go to auth_db.
"""
if model._meta.app_label == 'auth':
return 'auth_db'
return None
def allow_relation(self, obj1, obj2, **hints):
"""
Allow relations if a model in the auth app is involved.
"""
if obj1._meta.app_label == 'auth' or \
obj2._meta.app_label == 'auth':
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""
Make sure the auth app only appears in the 'auth_db'
database.
"""
if app_label == 'auth':
return db == 'auth_db'
return None
在您的设置文件中添加 DATABASE_ROUTERS = ['path.to.AuthRouter', 'path.to.PrimaryReplicaRouter']
- 这些只是从上面链接的文档中提取的示例,但它相对简单。
我会说,除非你有一个超级清晰和简洁的理由为什么你想这样做,否则不要这样做它。您可以在一个数据库中处理所有这些,一旦您走多数据库路线,您就会立即 cross-database limitations - 永远值得牢记。
我正在尝试使用 Django 创建一个 Q/A 网站,我想为所有应用程序使用多个数据库
- 两个安全数据库,如 admin、auth、forum
- 其余部分安全性较低(如 sqlite3)的数据库
但我不想重新配置我的模型和应用程序。
我该怎么做?
N.B:论坛是实现Q/A网站的应用程序
我的意思是,您显然需要进行一些重新配置。
大体上,将最常用的数据库设置为默认数据库,将另一个数据库设置为其他数据库 - 这是根据我的一个生产站点的数据库列表改编的。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'databasename',
'USER': 'mydefaultuser',
'PASSWORD': 'novelpassword',
'HOST':'first-host.com',
'PORT':'3306'
},
'auth': {
'ENGINE': 'sqlserver_pymssql',
'HOST': 'myserver.com',
'NAME': 'myauthdatabase',
'PASSWORD': 'passwordhere',
'PORT': 1433,
'USER': 'username'
}}
然后您可以在视图中显式使用其他数据库,使用 using
:
User.objects.using('auth').all()
...或者最好,您可以使用 Database Router:
更广泛地设置它class AuthRouter(object):
"""
A router to control all database operations on models in the
auth application.
"""
def db_for_read(self, model, **hints):
"""
Attempts to read auth models go to auth_db.
"""
if model._meta.app_label == 'auth':
return 'auth_db'
return None
def db_for_write(self, model, **hints):
"""
Attempts to write auth models go to auth_db.
"""
if model._meta.app_label == 'auth':
return 'auth_db'
return None
def allow_relation(self, obj1, obj2, **hints):
"""
Allow relations if a model in the auth app is involved.
"""
if obj1._meta.app_label == 'auth' or \
obj2._meta.app_label == 'auth':
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""
Make sure the auth app only appears in the 'auth_db'
database.
"""
if app_label == 'auth':
return db == 'auth_db'
return None
在您的设置文件中添加 DATABASE_ROUTERS = ['path.to.AuthRouter', 'path.to.PrimaryReplicaRouter']
- 这些只是从上面链接的文档中提取的示例,但它相对简单。
我会说,除非你有一个超级清晰和简洁的理由为什么你想这样做,否则不要这样做它。您可以在一个数据库中处理所有这些,一旦您走多数据库路线,您就会立即 cross-database limitations - 永远值得牢记。