运行 manage.py makemigrations for multiple databases in django

Running manage.py makemigrations for multiple databases in django

我正在尝试在我的 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'
   }
}

我为 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 迁移。它将保存在 MySQL.

但是当我在 models.py 文件中再添加一个 table 时:

# App/models.py
class Mongo(models.Model):
    Name = models.CharField(max_length=50)
    City = models.CharField(max_length=50)

我想在 MongoDB 中保存此 table。 如果我 运行 manage.py makemigrations 然后 运行 manage.py migrate --database=mongoproject,它将 'Mongo' Table 保存在 MongoDB由于之前的迁移,还保存 'ForSQL' table 到 MongoDB。

我需要帮助来设置路由器以区分每个 table 上的迁移。 我正在寻找此解决方案,但无法使它们正常工作。

这是我解决问题的方法

# 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 makemigrationsmanage.py migrate --database=default 默认数据库(在我的例子中 MySQL)和 manage.py migrate --database=mongoproject 命令 MongoDB。 它将在 MySQL 中保存 ForSQL table 并在 MongoDB 中保存 Mongo table。

这正是我所需要的。 希望对大家有所帮助。

这是帮助我的东西