gpt4 book ai didi

python - Django - 多个数据库 - 如何定义路由器?

转载 作者:行者123 更新时间:2023-12-05 06:37:06 27 4
gpt4 key购买 nike

我想将我的应用程序连接到 3 个不同的数据库。

为此,我更改了设置文件中的以下代码:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'local_db',
'USER': 'root',
'PASSWORD': 'password1',
'HOST': 'localhost',
'PORT': '3306',
'OPTIONS': { 'sql_mode': 'traditional', }
},
'firstExternalDb': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'firstExternalDb',
'USER': 'userName',
'PASSWORD': 'password1',
'HOST': 'firstExternalDb.node.com',
'PORT': '3306',
'OPTIONS': { 'sql_mode': 'traditional', }
},
'secondExternalDb': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'secondExternalDb',
'USER': 'userName',
'PASSWORD': 'password1',
'HOST': 'secondExternalDb.node.com',
'PORT': '3306',
'OPTIONS': { 'sql_mode': 'traditional', }
},
}

而且我希望能够指定我将为哪个数据库创建数据表。例如,我想保存在本地主机中的所有 django 表,如“auth_group”、“django_admin_log”。

试图通过本教程创建一个路由器 https://docs.djangoproject.com/pl/1.11/topics/db/multi-db/#topics-db-multi-db-routing

但是我不明白这个。你能回答我的问题吗:

  • 我应该为每个应用程序创建新的路由器吗?
  • 如何定义所有django 表应该被默认数据库使用?

我在两个模型文件中创建了两个路由器:第一个仅用于默认数据库:

class defaultRouter:
def db_for_read(self, model, **hints):
return 'default'

def db_for_write(self, model, **hints):
return 'default'

def allow_relation(self, obj1, obj2, **hints):
db_list = ('default')
if obj1._state.db in db_list and obj2._state.db in db_list:
return True
return None

def allow_migrate(self, db, app_label, model_name=None, **hints):
return True

下一个应用中的第二个:

class secondExternalDbRouter:
def db_for_read(self, model, **hints):
return 'secondExternalDb'

def db_for_write(self, model, **hints):
return 'secondExternalDb'

def allow_relation(self, obj1, obj2, **hints):
db_list = ('secondExternalDb')
if obj1._state.db in db_list and obj2._state.db in db_list:
return True
return None

def allow_migrate(self, db, app_label, model_name=None, **hints):
return True

两个路由器都在模型类下,在同一个文件中。

设置文件:

DATABASE_ROUTERS = ['mainApp.models.defaultRouter','secondApp.models.secondExternalDbRouter',]

最佳答案

您不必为每个应用程序创建一个新的路由器。如果使您的代码更加模块化,您可能想要这样做,即您可以将路由器与其他一些代码放在一起,但我个人最初不会这样做。

如果您没有为表指定读取或写入映射,将使用默认数据库。换句话说,您只需要为任何不使用默认数据库的情况创建路由逻辑。例如,这将强制一个表为只读但不影响任何其他内容:

class MyCustomRouter(object):
def db_for_write(self, model, **hints):
if model == MyReadOnlyModel:
raise Exception("This model is read only. Shame!")
return None

参见 Django - how to specify a database for a model?更多示例。

关于python - Django - 多个数据库 - 如何定义路由器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48427031/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com