python - 如何在 django 的同一个应用程序中使用不同的数据库?
问题描述
我有一个名为 xyz 的应用程序,我在该应用程序 view1.py 和 view2.py 中有 2 个视图,我将路由器配置为
if model._meta.app_label == 'xyz'
return database1
有没有办法从这个应用程序“xyz”中选择不同的数据库。
我的意思是同一个应用程序中有两个不同的数据库。
有没有办法或者 django 首先允许这样做。
解决方案
数据库相关内容的配置主要在 settings.py 文件中完成。因此,要将多个数据库添加到我们的 django 项目中,我们需要将它们添加到 DATABASES 字典中。
这些设置进入Settings.py
DATABASE_ROUTERS = ['path.to.DemoRouter']
DATABASE_APPS_MAPPING = {'user_data': 'users_db',
'customer_data':'customers_db'}
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
'users_db': {
'NAME': 'user_data',
'ENGINE': 'django.db.backends.postgresql',
'USER': 'postgres_user',
'PASSWORD': 'password'
},
'customers_db': {
'NAME': 'customer_data',
'ENGINE': 'django.db.backends.mysql',
'USER': 'mysql_cust',
'PASSWORD': 'root'
}
}
对于多个数据库,谈论数据库路由器会很好。默认路由方案确保如果未指定数据库,所有查询都回退到默认数据库。数据库路由器默认为 []。
把这个放进去models.py
class DemoRouter:
"""
A router to control all database operations on models in the
user application.
"""
def db_for_read(self, model, **hints):
"""
Attempts to read user models go to users_db.
"""
if model._meta.app_label == 'user_data':
return 'users_db'
elif model._meta.app_label == 'customer_data':
return 'customer_db'
return None
def db_for_write(self, model, **hints):
"""
Attempts to write user models go to users_db.
"""
if model._meta.app_label == 'user_data':
return 'users_db'
elif model._meta.app_label == 'customer_data':
return 'customer_db'
return None
def allow_relation(self, obj1, obj2, **hints):
"""
Allow relations if a model in the user app is involved.
"""
if obj1._meta.app_label == 'user_data' or \
obj2._meta.app_label == 'user_data':
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""
Make sure the auth app only appears in the 'users_db'
database.
"""
if app_label == 'user_data':
return db == 'users_db'
return None
相应的模型将被修改为
class User(models.Model):
username = models.Charfield(ax_length=100)
. . .
class Meta:
app_label = 'user_data'
class Customer(models.Model):
name = models.TextField(max_length=100)
. . .
class Meta:
app_label = 'customer_data'
使用多个数据库时几乎没有有用的命令。
$ ./manage.py migrate --database=users_db
推荐阅读
- powershell - 在 pscustomobject 中重复一个值
- swift - 无法在 ios 设备上模拟推送通知
- python - 使用带有 python 代码的屏幕管理器切换屏幕
- python - 无法在python中安装pptk
- python - 是否可以在没有 exec() 的情况下自动使模块的所有公共类方法成为全局函数?以turtle.py为例
- xaml - UWP XAML 智能感知 DataTemplate.DataType
- .net - .NET Profiler - 获取函数参数的类型
- typescript - 基于 Key 值在 TypeScript 中创建动态记录类型
- pandas - 如何提高 pyspark 到 Pandas 数据帧转换的效率,而不是 PyArrow 或使用它
- python - 创建工厂类