Django models 在django中为多个数据库运行manage.py makemigrations
我试图在Django项目中使用多个数据库,即MongoDB和MySQLDjango models 在django中为多个数据库运行manage.py makemigrations,django-models,multiple-databases,makemigrations,Django Models,Multiple Databases,Makemigrations,我试图在Django项目中使用多个数据库,即MongoDB和MySQL # settings.py DATABASES = { 'default': { 'NAME': 'sql_db', 'ENGINE': 'django.db.backends.mysql', 'USER': 'root', 'PASSWORD': 'root' }, 'mongoproject': { 'ENGINE' : '
# settings.py
DATABASES = {
'default': {
'NAME': 'sql_db',
'ENGINE': 'django.db.backends.mysql',
'USER': 'root',
'PASSWORD': 'root'
},
'mongoproject': {
'ENGINE' : 'djongo',
'NAME': 'mongo_db'
}
}
我为eg制作模型
# 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)
然后只需对默认数据库(在我的例子中是MySQL)运行命令manage.py makemigrations
和manage.py migrate--database=mongoproject
。
它将在MySQL
中保存ForSQL
表,在MongoDB
中保存Mongo
表
这正是我所需要的。
希望它能帮助别人
这就是帮助我解决问题的方法
# 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)
然后只需对默认数据库(在我的例子中是MySQL)运行命令manage.py makemigrations
和manage.py migrate--database=mongoproject
。
它将在MySQL
中保存ForSQL
表,在MongoDB
中保存Mongo
表
这正是我所需要的。
希望它能帮助别人
这就是帮助我制作数据库路由器的原因:我只使用一个应用程序,希望在不同的数据库中分离表。但每个时间表都是在每个数据库中创建的。我已经阅读了文档,我认为allow_migrate()可以工作。但无法正确编写。您可以制作一个数据库路由器:我只使用一个应用程序,希望在不同的数据库中分离表。但每个时间表都是在每个数据库中创建的。我已经阅读了文档,我认为allow_migrate()可以工作。但是写不好。