django-models - 在 django 中为多个数据库运行 manage.py makemigrations
问题描述
我试图在我的 Django 项目中使用多个数据库,即 MongoDB 和 MySQL。
# settings.py
DATABASES = {
'default': {
'NAME': 'sql_db',
'ENGINE': 'django.db.backends.mysql',
'USER': 'root',
'PASSWORD': 'root'
},
'mongoproject': {
'ENGINE' : 'djongo',
'NAME': 'mongo_db'
}
}
我为例如创建我的模型
# App/models.py
class ForSQL(models.Model):
Name = models.CharField(max_length=50)
City = models.CharField(max_length=50)
我想把它保存在 MySQL 中。为此,我将运行 manage.py makemigrations,然后运行 manage.py migrate。它将保存在 MySQL 中。
但是当我在 models.py 文件中添加一个表时,例如:
# App/models.py
class Mongo(models.Model):
Name = models.CharField(max_length=50)
City = models.CharField(max_length=50)
我想将此表保存在 MongoDB 中。如果我运行 manage.py makemigrations 然后运行 manage.py migrate --database=mongoproject,它会在 MongoDB 中保存“Mongo”表,并且由于之前的迁移,它还会在 MongoDB 中保存“ForSQL”表。
我需要帮助设置路由器以区分每个表上的迁移。我寻找这个解决方案,但无法让他们工作。
解决方案
这是我解决问题的方法
# routers.py
import App.models
allmodels = dict([(name.lower(), cls) for name, cls in App.models.__dict__.items() if isinstance(cls, type)])
def allow_migrate(self, db, app_label, model_name = None, **hints):
""" migrate to appropriate database per model """
try:
model = allmodels.get(model_name)
return(model.params.db == db)
except:
pass
# App/models.py
class ForSQL(models.Model):
class params:
db = 'default'
Name = models.CharField(max_length=50)
City = models.CharField(max_length=50)
class Mongo(models.Model):
class params:
db = 'mongoproject'
Name = models.CharField(max_length=50)
City = models.CharField(max_length=50)
然后只需运行命令manage.py makemigrations
和manage.py migrate --database=default
默认数据库(在我的情况下为 MySQL)和manage.py migrate --database=mongoproject
MongoDB。它将保存ForSQL
表格MySQL
和Mongo
表格MongoDB
。
这正是我所需要的。希望它会帮助某人。
推荐阅读
- c++ - 具有专用成员函数的默认模板参数
- reactjs - 将 redux 存储与 Tampermonkey 一起使用
- python - Python和matlab给出不同的答案
- php - 如何只为表中的唯一行推出 JSON?
- multithreading - 这种死锁在 Scala Future 中是如何发生的?
- for-loop - 如何在 ecal echo 中换行?在 bash 脚本中
- javascript - 使矩形闪烁
- python - Tkinter (Python) 将随机数输出到 GUI
- php - 以表格格式显示 Php (json) 输出
- windows-10-universal - Windows 应用程序证书工具包 (WACK) 日志文件夹?