gpt4 book ai didi

python - Django 1.2 中的多个数据库配置

转载 作者:IT老高 更新时间:2023-10-28 20:45:26 26 4
gpt4 key购买 nike

希望这是一个简单的问题。

我在理解 Django 1.2 中新的多数据库功能的文档时遇到了一些麻烦。首先,我似乎无法找到一个示例,说明您如何在其中一个模型中实际使用第二个数据库。

当我在我的 models.py 中定义一个新类时,我如何指定我打算连接到哪个数据库?

我的 settings.py 包含类似于 -

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'modules',
'USER': 'xxx',
'PASSWORD': 'xxx',
},
'asterisk': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'users',
'USER': 'xxxx',
'PASSWORD': 'xxxx',
}

}

编辑:我像个傻瓜一样阅读有关路由器的文档。如果其他人为此苦苦挣扎,请确保您在放弃之前阅读了 2 或 3 遍!

最佳答案

是的,有点复杂。

您可以通过多种方式实现它。基本上,您需要某种方式来指示哪些模型与哪个数据库相关联。

第一个选项

这是我使用的代码;希望有帮助。

from django.db import connections

class DBRouter(object):
"""A router to control all database operations on models in
the contrib.auth application"""

def db_for_read(self, model, **hints):
m = model.__module__.split('.')
try:
d = m[-1]
if d in connections:
return d
except IndexError:
pass
return None

def db_for_write(self, model, **hints):
m = model.__module__.split('.')
try:
d = m[-1]
if d in connections:
return d
except IndexError:
pass
return None

def allow_syncdb(self, db, model):
"Make sure syncdb doesn't run on anything but default"
if model._meta.app_label == 'myapp':
return False
elif db == 'default':
return True
return None

它的工作方式是创建一个文件,其中包含要使用的数据库名称来保存我的模型。在您的情况下,您将创建一个名为 asterisk.py 的单独 models 样式文件,该文件与您的应用程序的模型位于同一文件夹中。

在您的 models.py 文件中,您将添加

from asterisk import *

然后,当您实际从该模型请求记录时,它的工作方式如下:

  1. records = MyModel.object.all()
  2. MyModel 的模块是 myapp.asterisk
  3. 有一个名为“星号”的连接,所以请使用它而不是“默认”

第二个选项

如果您想对数据库选择进行每个模型的控制,这样的事情会起作用:

from django.db import connections

class DBRouter(object):
"""A router to control all database operations on models in
the contrib.auth application"""

def db_for_read(self, model, **hints):
if hasattr(model,'connection_name'):
return model.connection_name
return None

def db_for_write(self, model, **hints):
if hasattr(model,'connection_name'):
return model.connection_name
return None

def allow_syncdb(self, db, model):
if hasattr(model,'connection_name'):
return model.connection_name
return None

那么对于每个模型:

class MyModel(models.Model):
connection_name="asterisk"
#etc...

请注意,我没有测试过第二个选项。

关于python - Django 1.2 中的多个数据库配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3637419/

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